xgplayer 3.0.25-alpha.0 → 3.0.25-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/es/lang/zh-hk.js +1 -1
- package/es/mediaProxy.d.ts +6 -17
- package/es/mediaProxy.js +21 -35
- package/es/player.d.ts +2 -2
- package/es/player.js +3 -3
- package/es/plugin/plugin.d.ts +0 -2
- package/es/plugin/plugin.js +1 -3
- package/es/plugin/pluginsManager.d.ts +14 -14
- package/es/plugin/pluginsManager.js +9 -22
- package/es/plugins/keyboard/index.js +1 -1
- package/es/plugins/pc/index.js +1 -1
- package/es/plugins/progress/innerList.js +1 -1
- package/es/plugins/progressPreview/dotsApi.js +1 -1
- package/es/plugins/stats/index.js +1 -1
- package/es/plugins/time/timesegments.js +1 -1
- package/es/utils/util.d.ts +55 -57
- package/es/utils/util.js +0 -2
- package/es/version.js +1 -1
- package/package.json +2 -2
package/dist/index.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.min.js","sources":["../src/version.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/error.js","../src/events.js","../../../node_modules/eventemitter3/index.js","../src/instManager.js","../src/lang/en.js","../src/lang/i18n.js","../src/utils/sniffer.js","../src/mediaProxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugins/common/iconTools.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/defaultConfig.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/player.js","../src/plugins/common/iconPlugin.js","../src/plugins/cssFullScreen/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/play/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/miniScreen/miniScreenIcon.js","../src/utils/draggabilly.js","../src/plugins/miniScreen/index.js","../src/plugins/pc/index.js","../src/plugins/mobile/touch.js","../src/plugins/mobile/index.js","../src/plugins/keyboard/index.js","../src/plugins/loading/index.js","../src/plugins/time/timesegments.js","../src/plugins/rotate/index.js","../src/plugins/pip/index.js","../src/plugins/playNext/index.js","../src/plugins/download/saveAs.js","../src/plugins/download/index.js","../src/plugins/screenShot/index.js","../src/plugins/common/optionList.js","../src/plugins/common/optionsIcon.js","../src/plugins/definition/index.js","../src/plugins/playbackRate/index.js","../src/plugins/error/index.js","../src/plugins/prompt/index.js","../src/plugins/progressPreview/dotsApi.js","../src/plugins/progressPreview/index.js","../src/plugins/common/thumbnail.js","../src/plugins/progress/miniProgress.js","../src/plugins/dynamicBg/index.js","../src/plugins/stats/index.js","../src/plugins/gapJump/index.js","../src/plugins/waitingTimeoutJump/index.js","../src/plugins/testspeed/index.js","../src/plugins/fpsDetect/index.js","../src/presets/default.js","../src/lang/zh-cn.js","../src/index.umd.js"],"sourcesContent":["/**\n * @type {string}\n * */\nexport default __VERSION__\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 0\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { {[propName: string]: any} } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array<any>} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array<string> } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Event} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { boolean }\n */\nutil.isMSE = function (video) {\n if (video.media) {\n video = video.media\n }\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\nutil.debounce = debounce\nutil.throttle = throttle\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n drm: {\n code: 8\n },\n ad: {\n code: 9\n },\n other: {\n code: 1000\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const LOADED_METADATA = 'loadedmetadata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\nexport const LEAVE_PLAYER = 'leaveplayer'\nexport const ENTER_PLAYER = 'enterplayer'\nexport const LOADING = 'loading'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'loadedmetadata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n\nexport const FPS_STUCK = 'fps_stuck'","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import { EventEmitter } from 'eventemitter3'\n\n/**\n * @typedef { (Player) => ?boolean } IterateFunction\n */\n/**\n * @typedef { import('./player').default } Player\n */\n\n/**\n * global player instance memory\n * @type {{\n * [key:string]:\n * }}\n */\nconst store = {}\n\nlet instance = null\n/**\n * Design as a class so that can be inherited to enhance functionality\n */\nexport class InstManager extends EventEmitter {\n static getInstance () {\n instance ||= new InstManager()\n return instance\n }\n\n add (player) {\n if (!player) {\n return\n }\n store[player.playerId] = player\n\n // By default, the first one is active\n if (Object.keys(store).length === 1) {\n this.setActive(player.playerId, true)\n }\n }\n\n remove (player) {\n if (!player) {\n return\n }\n const isUserActive = player.isUserActive\n\n delete store[player.playerId]\n\n if (isUserActive) {\n // 暂时注释,有需求再打开\n // const keys = Object.keys(this.store)\n // if (keys.length > 0) {\n // this.setActive(keys[keys.length - 1], true)\n // }\n }\n }\n\n /**\n * @private\n * @param {IterateFunction} fn\n * @param {?boolean} endEarly\n */\n _iterate (fn, endEarly = false) {\n for (const key in store) {\n if (Object.prototype.hasOwnProperty.call(store, key)) {\n const player = store[key]\n\n if (endEarly) {\n if (fn(player)) {\n break\n }\n } else {\n fn(player)\n }\n }\n }\n }\n\n /**\n * @param {IterateFunction} fn\n */\n forEach (fn) {\n this._iterate(fn)\n }\n\n /**\n * Iterates over items of store, returning the first one\n * @param {IterateFunction} fn\n * @returns {Player}\n */\n find (fn) {\n let result = null\n\n this._iterate((player) => {\n const flag = fn(player)\n if (flag) {\n result = player\n }\n return flag\n }, true)\n\n return result\n }\n\n /**\n * @param {IterateFunction} fn\n * @returns {Player[]}\n */\n findAll (fn) {\n const results = []\n\n this._iterate((player) => {\n if (fn(player)) {\n results.push(player)\n }\n })\n\n return results\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setActive (playerId, isActive = true) {\n if (!store[playerId]) {\n return\n }\n if (isActive) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = true\n inst.isInstNext = false\n } else {\n inst.isUserActive = false\n }\n })\n } else {\n store[playerId].isUserActive = isActive\n }\n return playerId\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getActiveId () {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const c = store[keys[i]]\n if (c && c.isUserActive) {\n return keys[i]\n }\n }\n return null\n }\n\n /**\n * 标记下一个实例\n * @param { number | string } playerId\n * @param { boolean } isNext\n * @returns { number | null }\n */\n setNext (playerId, isNext = true) {\n if (!store[playerId]) {\n return\n }\n if (isNext) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = false\n inst.isInstNext = true\n } else {\n inst.isInstNext = false\n }\n })\n } else {\n store[playerId].isInstNext = isNext\n }\n\n return playerId\n }\n}\n\n/**\n* Check whether there is a player instance in the current dom\n* @param {Element} root\n*/\nexport function checkPlayerRoot (root) {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const p = store[keys[i]]\n if (p.root === root) {\n return p\n }\n }\n return null\n}\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n TEXTTRACK_OFF: 'Off',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: any\n * }\n * } } IXGI18nText\n */\n\n/**\n * @typedef { {\n * lang: { [propName: string]: IXGI18nText },\n * langKeys: Array<string>, // list of all currently supported languages\n * textKeys: { [propName: string]: string } // list of all currently supported texts\n * } } IXGI18n\n */\n\nconst XGI18nLang = {\n lang: {},\n langKeys: [],\n textKeys: []\n}\n\nfunction deepMerge (dst, src) {\n Object.keys(src).forEach(key => {\n const _s = Util.typeOf(src[key])\n const _t = Util.typeOf(dst[key])\n if (_s === 'Array') {\n if (_t !== 'Array') {\n dst[key] = []\n }\n dst[key].push(...src[key])\n } else if (_s === 'Object') {\n if (_t !== 'Object') {\n dst[key] = {}\n }\n deepMerge(dst[key], src[key])\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.lang.en).map(key => {\n XGI18nLang.textKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array<IXGI18nText> } i18nTextList\n * @param { IXGI18n } [i18nLangs]\n */\nfunction extend (i18nTextList, i18nLangs) {\n let ext = []\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n if (Util.typeOf(i18nTextList) !== 'Array') {\n ext = Object.keys(i18nTextList).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: i18nTextList[lang]\n }\n })\n } else {\n ext = i18nTextList\n }\n const { lang } = i18nLangs\n ext.map(item => {\n if (item.LANG === 'zh') {\n item.LANG = 'zh-cn'\n }\n if (!lang[item.LANG]) {\n use(item, i18nLangs)\n } else {\n deepMerge(lang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n * @param { IXGI18n } [i18nLangs]\n */\nfunction use (langData, i18nLangs) {\n let _clang = langData.LANG\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n const texts = langData.TEXT || {}\n if (_clang === 'zh') {\n _clang = 'zh-cn'\n }\n if (!i18nLangs.lang[_clang]) {\n i18nLangs.langKeys.push(_clang)\n i18nLangs.lang[_clang] = texts\n } else {\n deepMerge(i18nLangs.lang[_clang], texts)\n }\n updateKeys()\n}\n\n/**\n *\n * @returns { IXGI18n }\n */\nfunction init (id) {\n const ret = {\n lang: {},\n langKeys: [],\n textKeys: {},\n pId: id\n }\n deepMerge(ret.lang, XGI18nLang.lang)\n ret.langKeys.push(...XGI18nLang.langKeys)\n deepMerge(ret.textKeys, XGI18nLang.textKeys)\n return ret\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nLang.textKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array<string> }\n */\n get langKeys () {\n return XGI18nLang.langKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLang.langKeys.map(key => {\n ret[key] = XGI18nLang.lang[key]\n })\n if (XGI18nLang.lang['zh-cn']) {\n ret.zh = XGI18nLang.lang['zh-cn'] || {}\n }\n return ret\n },\n\n /**\n * @desc Extend existing languages text\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * Add new language text\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use,\n\n /**\n * Initialize a language text\n * @return { IXGI18n }\n */\n init: init\n}\n\nexport default I18N\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\n */\n\n/**\n * @typedef {{\n * device: 'pc' | 'mobile',\n * browser: 'ie' | 'firefox' | 'chrome' | 'opera' | 'safari',\n * os: {\n * isTablet: boolean,\n * isPhone: boolean,\n * isIpad: boolean,\n * isIos: boolean,\n * isAndroid: boolean,\n * isPc: boolean,\n * isSymbian: boolean,\n * isWindowsPhone: boolean,\n * isFireFox: boolean,\n * isHarmonyOS: boolean\n * },\n * isWeixin: boolean,\n * isSupportMP4(): ICheckResult,\n * isHevcSupported(): boolean,\n * probeConfigSupported(info: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>\n * }} ISniffer\n */\n\nconst VERSION_REG = {\n android: /(Android)\\s([\\d.]+)/,\n harmony: /(OpenHarmony|HarmonyOS)\\s([\\d.]+)/,\n ios: /(Version)\\/([\\d.]+)/\n}\n\nconst H264_MIMETYPES = [\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'avc1.42E01E',\n 'mp4v.20.8',\n 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0] || ''\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isTizen = /(?:Tizen)/ig.test(ua) // Samsung Tizen TV\n const isWebOS = /(?:Web0S)/ig.test(ua) // LG TV\n const isHarmonyOS = /(?:OpenHarmony|HarmonyOS)/i.test(ua)\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n ((isHarmonyOS || isFireFox) && /(?:Tablet)/.test(ua))\n const isPhone = /(?:Phone)/.test(ua) /* iPhone or HarmonyOS Phone */ && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox,\n isHarmonyOS,\n isTizen,\n isWebOS\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n // ios\n reg = VERSION_REG.ios\n } else if (/(?:OpenHarmony|HarmonyOS)/i.test(ua)) {\n // harmony os\n reg = VERSION_REG.harmony\n } else {\n // android\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise<MediaCapabilitiesDecodingInfo> }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS, SOURCE_ERROR, SOURCE_SUCCESS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey, e.error)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e, _err) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n if (eventKey === 'error') {\n eData.error = _err || player.video.error\n }\n\n // 执行video相关事件中间件能力\n if (player.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[eventKey].call(player, eData, callback)\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass MediaProxy extends EventEmitter {\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n super(options)\n /**\n * @type { boolean }\n * @private\n */\n this._hasStart = false\n /**\n * @type { number }\n * @private\n */\n this._currentTime = 0\n /**\n * @type { number }\n * @private\n */\n this._duration = 0\n /**\n * @type {{[propName: string]: any}}\n * @private\n */\n this._internalOp = {}\n /**\n * @type { boolean }\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media =\n options.mediaEl instanceof HTMLMediaElement\n ? options.mediaEl\n : typeof options.mediaEl === 'function'\n ? options.mediaEl(this.mediaConfig)\n : Util.createDom(this.mediaConfig.mediaType, '', this.mediaConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.media.defaultPlaybackRate = this.media.playbackRate = options.defaultPlaybackRate\n }\n\n if (Util.typeOf(options.volume) === 'Number') {\n this.volume = options.volume\n }\n\n if (options.autoplayMuted) {\n this.media.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.media.autoplay = true\n }\n\n // Warning:一些移动端浏览器(Like Vivo)需要直接设置JS属性,否则会导致失效\n if (options.playsinline) {\n this.media.playsinline = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.mediaEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * @description Assemble source elements for the media element,\n * and add error event listeners to each source element\n * @public\n */\n assembleSource (urls, mediaEl) {\n const media = mediaEl || this.media || this.video;\n urls.forEach((item, index) => {\n media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n\n const _c = media.children\n\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n\n // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n }\n\n /**\n * @description disassemble source elements for the media element\n * @public\n */\n disassembleSource (mediaEl) {\n const media = mediaEl || this.media || this.video;\n const _c = media.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n media.removeChild(_c[0])\n }\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n video.load()\n\n this.assembleSource(video, urls)\n\n const _c = video.children\n if (!_c) {\n return\n }\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\n video.addEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n this.disassembleSource(video)\n this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!(this.media.currentSrc || this.media.srcObject)) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n /**\n * @type { number }\n * @description 返回视频的纵横比\n */\n get aspectRatio () {\n return this.media ? this.media.videoWidth / this.media.videoHeight : 0\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = runHooks(this, hookName, handler, ...arguments)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\nfunction findHookIndex (hookName, handler) {\n const { __hooks } = this\n if (!__hooks || !Array.isArray(__hooks[hookName])) {\n return -1\n }\n const hookHandlers = __hooks[hookName]\n for (let i = 0; i < hookHandlers.length; i++) {\n if (hookHandlers[i] === handler) {\n return i\n }\n }\n return -1\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n if (!Array.isArray(__hooks[hookName])) {\n __hooks[hookName] = []\n }\n\n if (findHookIndex.call(this, hookName, handler) === -1) {\n __hooks[hookName].push(handler)\n }\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n\n if (Array.isArray(__hooks[hookName])) {\n const hooks = __hooks[hookName]\n const index = findHookIndex.call(this, hookName, handler)\n\n if (index !== -1) {\n hooks.splice(index, 1)\n }\n } else if (__hooks[hookName]) {\n __hooks[hookName] = null\n // delete __hooks[hookName]\n }\n}\n\n/**\n * Add hooks to a plugin\n * @param { string } pluginName\n * @param {...any} args\n */\nfunction usePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n return plugin.useHooks && plugin.useHooks(...args)\n}\n\nfunction removePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n if (plugin) {\n return plugin.removeHooks && plugin.removeHooks(...args)\n }\n}\n\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array<string> } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && Array.isArray(obj.__hooks[hookName])) {\n const hooks = obj.__hooks[hookName]\n let index = -1\n /**\n * @private\n */\n const runHooksRecursive = function (obj, hookName, handler, ...args) {\n index++\n // 递归终止条件\n if (hooks.length === 0 || index === hooks.length) {\n return handler.call(obj, obj, ...args)\n }\n // 递归调用\n const hook = hooks[index]\n const ret = hook.call(obj, obj, ...args)\n if (ret && ret.then) {\n return ret.then((data) => {\n return data === false ? null : runHooksRecursive(obj, hookName, handler, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else if (ret === false) {\n return false\n }\n }\n\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n static defineMethod (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === 'function') {\n Object.defineProperty(Obj, key, {\n configurable: true,\n value: map[key]\n })\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @protected\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array<string> } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__onceEvents[event] = callback\n this.player.once(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__onceEvents[item] = callback\n this.player.once(event, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n off (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.off(event, callback)')\n return\n }\n if (typeof event === 'string') {\n delete this.__events[event]\n this.player.off(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n delete this.__events[event]\n this.player.off(item, callback)\n })\n }\n }\n\n offAll () {\n ['__events', '__onceEvents'].forEach(key => {\n Object.keys(this[key]).forEach(item => {\n this[key][item] && this.off(item, this[key][item])\n item && delete this[key][item]\n })\n })\n this.__events = {}\n this.__onceEvents = {}\n }\n\n /**\n *\n * @param { string } event\n * @param {...any} res\n * @returns\n */\n emit (event, ...res) {\n if (!this.player) {\n return\n }\n this.player.emit(event, ...res)\n }\n\n emitUserAction (event, action, params = {}) {\n if (!this.player) {\n return\n }\n const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removeHooks (hookName, handler, ...args) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n ${plugin.i18n[textKey]}\n </div>`\n } catch (e) {\n return '<div class=\"xg-tips hide\"></div>'\n }\n}","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\nimport { xgIconTips } from '../plugins/common/iconTools'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\nconst PLUGIN_STATE_CLASS = {\n ICON_DISABLE: 'xg-icon-disable',\n ICON_HIDE: 'xg-icon-hide'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { string | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { string } querySelector\n * @param { string | Array<string> } eventType\n * @param { Function } callback\n * @param { boolean } [capture=false]\n * @returns\n */\n static delegate (root, querySelector, eventType, callback, capture = false) {\n const dels = []\n if (root instanceof window.Node && typeof callback === 'function') {\n if (Array.isArray(eventType)) {\n eventType.forEach((item) => {\n const ret = delegate(root, querySelector, item, callback, capture)\n ret.key = `${querySelector}_${item}`\n dels.push(ret)\n })\n } else {\n const ret = delegate(root, querySelector, eventType, callback, capture)\n ret.key = `${querySelector}_${eventType}`\n dels.push(ret)\n }\n }\n return dels\n }\n\n static iconTip = xgIconTips;\n\n static get ROOT_TYPES () {\n return ROOT_TYPES\n }\n\n static get POSITIONS () {\n return POSITIONS\n }\n\n /**\n * @param { IPluginOptions } args\n */\n constructor (args = {}) {\n super(args)\n /**\n * @private\n */\n this.__delegates = []\n }\n\n /**\n * @protected\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n /**\n * store the extra HTMLElements except root\n * @readonly\n * @type {HTMLElement[]}\n */\n this.extraEls = []\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n /**\n *\n */\n disable () {\n this.config.disable = true\n Util.addClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n enable () {\n this.config.disable = false\n Util.removeClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n * @param { Function } [callback]\n */\n bind (querySelector, eventType, callback) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.bindEL(item, eventType)\n })\n } else {\n this.bindEL(querySelector, eventType)\n }\n } else {\n const ret = Plugin.delegate.call(this, this.root, querySelector, eventType, callback)\n this.__delegates = this.__delegates.concat(ret)\n }\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n */\n unbind (querySelector, eventType) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.unbindEL(item, eventType)\n })\n } else {\n this.unbindEL(querySelector, eventType)\n }\n } else {\n const key = `${querySelector}_${eventType}`\n for (let i = 0; i < this.__delegates.length; i++) {\n if (this.__delegates[i].key === key) {\n this.__delegates[i].destroy()\n this.__delegates.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * 给插件设置样式\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setStyle (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return (this.root.style[name] = value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.style[key] = name[key]\n })\n }\n }\n\n /**\n * 给插件根节点设置属性\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setAttr (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return this.root.setAttribute(name, value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.setAttribute(key, name[key])\n })\n }\n }\n\n /**\n *\n * @param { string } htmlStr\n * @param { Function } [callback]\n * @returns\n */\n setHtml (htmlStr, callback) {\n if (!this.root) {\n return\n }\n this.root.innerHTML = htmlStr\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble=false]\n * @returns\n */\n bindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.addEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble]\n * @returns\n */\n unbindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.removeEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } [value]\n * @returns\n */\n show (value) {\n if (!this.root) {\n return\n }\n this.root.style.display = value !== undefined ? value : 'block'\n const cs = window.getComputedStyle(this.root, null)\n const cssDisplayValue = cs.getPropertyValue('display')\n if (cssDisplayValue === 'none') {\n return (this.root.style.display = 'block')\n }\n }\n\n hide () {\n this.root && (this.root.style.display = 'none')\n }\n\n /**\n *\n * @param { string | HTMLElement } pdom\n * @param { HTMLElement} child\n * @returns { HTMLElement | null }\n */\n appendChild (pdom, child) {\n if (!this.root) {\n return null\n }\n if (arguments.length < 2 && arguments[0] instanceof window.Element) {\n return this.root.appendChild(arguments[0])\n }\n if (!child || !(child instanceof window.Element)) {\n return null\n }\n try {\n if (typeof pdom === 'string') {\n return this.find(pdom).appendChild(child)\n } else {\n return pdom.appendChild(child)\n }\n } catch (err) {\n XG_DEBUG.logError('Plugin:appendChild', err)\n return null\n }\n }\n\n /**\n *\n * @returns { string | HTMLElement }\n */\n render () {\n return ''\n }\n\n destroy () {}\n\n __destroy () {\n const { player } = this\n this.__delegates.map(item => {\n item.destroy()\n })\n this.__delegates = []\n // destroy the sub-plugin instance\n if (this._children instanceof Array) {\n this._children.map(item => {\n player.unRegisterPlugin(item.pluginName)\n })\n this._children = null\n }\n if (this.root) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.root.hasOwnProperty('remove')) {\n this.root.remove()\n } else if (this.root.parentNode) {\n this.root.parentNode.removeChild(this.root)\n }\n }\n\n super.__destroy()\n this.icons = {};\n ['root', 'parent'].map(item => {\n this[item] = null\n })\n this.extraEls = []\n }\n}\n\nexport {\n Plugin as default,\n ROOT_TYPES,\n POSITIONS,\n PLUGIN_STATE_CLASS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer?.unobserve(target)\n } catch (e) {}\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer?.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\n/**\n * @type {ResizeObserver | null}\n */\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver?.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver?.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import Util from '../utils/util'\nimport { addObserver, unObserver } from './resizeObserver'\n\n/**\n * a plugins manager to register and search\n **/\n\nconst pluginsManager = {\n pluginGroup: {},\n init(player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver &&\n addObserver(player.root, () => {\n player.resize()\n })\n\n this.pluginGroup[cgid] = {\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n formatPluginInfo(plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array <any> } plugins\n * @returns boolean\n */\n checkPluginIfExits(pluginName, plugins) {\n for (let i = 0; i < plugins.length; i++) {\n if (pluginName.toLowerCase() === plugins[i].pluginName.toLowerCase()) {\n return true\n }\n }\n return false\n },\n\n /**\n * get plugin Config from playerConfig\n * @param { string } pluginName\n * @param { {[propName: string]: any;} } playerConfig\n * @return { {[propName: string]: any;} } pluginConfig\n */\n getRootByConfig(pluginName, playerConfig) {\n const keys = Object.keys(playerConfig)\n let _pConfig = null\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n _pConfig = playerConfig[keys[i]]\n break\n }\n }\n\n if (Util.typeOf(_pConfig) === 'Object') {\n return {\n root: _pConfig.root,\n position: _pConfig.position\n }\n }\n return {}\n },\n\n /**\n * register a lazy plugin\n * @param { any } player instance\n * @param { any } lazyPlugin config\n *\n */\n lazyRegister(player, lazyPlugin) {\n const timeout = lazyPlugin.timeout || 1500\n return Promise.race([\n lazyPlugin.loader().then((plugin) => {\n let result\n if (plugin?.__esModule) {\n result = plugin.default\n } else {\n result = plugin\n }\n this.register(player, result, plugin.options)\n }),\n new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error('timeout'))\n }, timeout)\n })\n ])\n },\n /**\n * register a Plugin\n * @param { any } player the plugins register\n * @param { any } plugin the plugin contructor\n * @param { any } options the plugin configuration\n * @return { any } Plugin the plugin instance\n **/\n register(player, plugin, options = {}) {\n if (\n !player ||\n !plugin ||\n typeof plugin !== 'function' ||\n plugin.prototype === undefined\n ) {\n return\n }\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = {}\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (\n plugin.isSupported &&\n !plugin.isSupported(player.config.mediaType, player.config.codecType)\n ) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach((key) => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(\n `the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`\n )\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw err\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister(cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin(player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins(player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin(player, condition) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n\n // as pluginName\n if (typeof condition === 'string') {\n const cName = condition.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName] || null\n } else if (typeof condition === 'function') {\n // as function\n const plugins = this.pluginGroup[cgid]._plugins\n for (const key in plugins) {\n if (condition(plugins[key])) {\n return plugins[key] || null\n }\n }\n }\n return null\n },\n\n beforeInit(player) {\n function retPromise(fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins?.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach((pName) => {\n if (plugins[pName]?.beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet])\n .then(() => {\n resolve()\n })\n .catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit(player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach((pName) => {\n if (plugins[pName]?.afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang(lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach((item) => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender(player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach((pName) => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach((item) => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady(player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach((key) => {\n if (\n plugins[key].onPluginsReady &&\n typeof plugins[key].onPluginsReady === 'function'\n ) {\n plugins[key].onPluginsReady()\n }\n })\n },\n\n destroy(player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * }} IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * mediaEl?: HTMLMediaElement | (mediaConfig: { [propName: string]: any }) => HTMLMediaElement,\n * url?: IUrl,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover'|'contain',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: any },\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: boolean | Array<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * remainMediaAfterDestroy?: boolean,\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: true, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.media.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n preProcessUrl: null, // url preprocessing callback\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = (e) => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n this.left = null\n this.center = null\n this.right = null\n this.innerRoot = null\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\n","import MediaProxy from './mediaProxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\nimport { InstManager, checkPlayerRoot } from './instManager'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n * @typedef { import ('./defaultConfig').IUrl } IUrl\n */\n\n/**\n * @typedef {boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\n/* eslint-disable camelcase */\nconst PLAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n/** @type { InstManager } */\nlet instManager = null\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static set instManager (value) {\n instManager = value\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static get instManager () {\n return instManager\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.getActiveId()\n */\n static getCurrentUserActivePlayerId () {\n return instManager?.getActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.setActive()\n */\n static setCurrentUserActive (playerId, isActive) {\n instManager?.setActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PLAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @public\n * @description This switch provides the playback plugin with the ability\n * to handle media source by itself.\n */\n this.handleSource = true\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isAd = false\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @type { number }\n * @private\n * @readonly\n */\n this.__startTime = -1\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n this.timeSegments = []\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { ?IDefinition }\n * @public\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { ?Controls }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n /**\n * @type {InstManager}\n */\n this.instManager = instManager\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // Initialize curDefinition and url\n const { definition = {}, url } = this.config\n if (Array.isArray(definition?.list) && definition.list.length > 0) {\n let curDefinition = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n if (!curDefinition) {\n definition.defaultDefinition = definition.list[0].definition\n curDefinition = definition.list[0]\n }\n this.curDefinition = curDefinition\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n if (!url) {\n this.config.url = curDefinition.url\n }\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady?.()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.config.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n this.media.setAttribute(PLATER_ID, this.playerId)\n\n instManager?.add(this)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n if (this.config.controls) {\n const _root = this.config.controls.root || null\n const controls = pluginsManager.register(this, Controls, { root: _root })\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n _clearUserTimer () {\n if (!this.userTimer) {\n return\n }\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n\n /**\n * @param { any } [url]\n * @param { { playSessionId?: number } } [options]\n * @returns\n */\n _startInit (url, options = {}) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n\n if (Util.isNotNull(options.playSessionId)) {\n // PlaySessionId, used to identify a single play session,\n // for internal use by the player\n this._playSessionId = options.playSessionId\n }\n\n if (this.handleSource) {\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\n }\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return this.controls?.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string | function } condition\n * @return { null | any } plugin\n */\n getPlugin (condition) {\n const plugin = pluginsManager.findPlugin(this, condition)\n return plugin?.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } [url]\n * @returns { Promise<void> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n\n const playSessionId = this._playSessionId\n if (Util.isNotNull(playSessionId)) {\n this._playSessionId = undefined\n }\n\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.url, { playSessionId })\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { SwitchUrlOptions } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n this._seekToStartTime()\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.media && this.media.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n this._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { import('./defaultConfig').IDefinition } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url, {\n seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this._useAutoplay = false\n this.mediaPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<string> } unregisterPlugins 重置的时候需要卸载重新初始化的插件列表\n * @param { boolean } [isResetConfig] 是否需要重置配置列表\n * @returns\n */\n reset (unregisterPlugins = [], isResetConfig) {\n this.resetState()\n const { plugins } = this\n\n if (!plugins) {\n return\n }\n\n unregisterPlugins.map((pn) => {\n this.deregister(pn)\n })\n\n if (isResetConfig) {\n const de = getDefaultConfig()\n Object.keys(this.config).forEach((k) => {\n if (\n this.config[k] !== 'undefined' &&\n (k === 'plugins' || k === 'presets' || k === 'el' || k === 'id')\n ) {\n this.config[k] = de[k]\n }\n })\n }\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n media.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n instManager?.remove(this)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) && !this.config.remainMediaAfterDestroy &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.SEEKED, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (el === 'video' || el === 'media') {\n el = this[el]\n }\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return Promise.resolve()\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n ret.catch(() => {})\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n const ret = media.webkitExitFullScreen()\n if(ret && ret.catch){\n ret.catch(() => {})\n }\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el = this.config.fullscreenTarget) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this._rootStyle = this.root.getAttribute('style')\n const isRotate90 = Math.abs(window.orientation) === 90 || Math.abs(screen.orientation.angle) === 90\n // 如果已经是横屏状态,则取innerWidth,否则取innerHeight\n this.root.style.width = isRotate90 ? `${window.innerWidth}px` : `${window.innerHeight}px`\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this._clearUserTimer()\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n this._clearUserTimer()\n if (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n this._clearUserTimer()\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (this.innerStates.isActiveLocked) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n this._seekToStartTime()\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n let el = this._fullscreenEl\n if (!el && (this.root.contains(event.target) || event.target === this.root)) {\n el = event.target\n }\n this.recoverFullStyle( this.root, el, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n if (this.__startTime > 0) {\n if (this.duration > 0) {\n this._seekToStartTime()\n } else {\n // 在安卓原生video播放hls时,loadeddata触发时durationchange事件虽然已经触发过了但duration仍然为0,\n // 需要在下一次durationchange触发时再重新设置起播时间\n this.once(Events.DURATION_CHANGE, () => {\n this._seekToStartTime()\n })\n }\n }\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n this._clearUserTimer()\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n this.emit(Events.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, this.config.minWaitDelay)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state === STATES.NOTALLOW && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n * 目标时间点是否在buffer内\n * @param { number } time 时间点\n * @param options 判断阈值配置,可选的\n * @param options.startDiff 判断起始阈值,即该时间下距离buffer开始点超过阈值时才算作在buffer内,默认为0\n * @param options.endDiff 判断结束阈值,即该时间下距离buffer结束点超过阈值时才算作在buffer内,默认为0\n * @returns { boolean }\n */\n checkBuffer (\n time,\n options = {\n startDiff: 0,\n endDiff: 0\n }) {\n const { startDiff = 0, endDiff = 0 } = options || {}\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) + startDiff <= currentTime && buffered.end(i) - endDiff > currentTime) {\n return true\n }\n }\n return false\n }\n\n resizePosition () {\n const { vy, vx, h, w } = this.videoPos\n let rotate = this.videoPos.rotate\n if (rotate < 0 && h < 0 && w < 0) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n rotate = rotate < 0 ? 0 : rotate\n const _pos = {\n rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n const styles = {}\n let rHeight = height\n let rWidth = width\n\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n styles.width = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxWidth = ''\n styles.maxHeight = ''\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n styles.width = `${rWidth}px`\n styles.maxWidth = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxHeight = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n styles.transform = formStyle\n styles.webkitTransform = formStyle\n\n Object.keys(styles).map(key => {\n this.media.style[key] = styles[key]\n })\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media || !this.root) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.resizePosition()\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n * @public\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl, preProcessUrlOptions } = this.config\n const processUrlOptions = Object.assign({}, preProcessUrlOptions, ext)\n return !Util.isBlob(url) && typeof preProcessUrl === 'function' ? preProcessUrl(url, processUrlOptions) : { url }\n }\n\n\n /**\n * @description 跳转至配置的起播时间点\n */\n _seekToStartTime () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array.<IDefinition> }\n */\n set definitionList (list) {\n const { definition } = this.config\n let curDef = null\n let targetDef = null\n\n definition.list = list\n this.emit('resourceReady', list)\n\n list.forEach((item) => {\n if (this.curDefinition?.definition === item.definition) {\n curDef = item\n }\n if (definition.defaultDefinition === item.definition) {\n targetDef = item\n }\n })\n if (!targetDef && list.length > 0) {\n targetDef = list[0]\n }\n curDef\n ? this.changeDefinition(curDef)\n : targetDef && this.changeDefinition(targetDef)\n }\n\n get definitionList () {\n if (!this.config || !this.config.definition) {\n return []\n }\n return this.config.definition.list || []\n }\n\n /**\n * @description VideoFrames infos\n * @type { {\n * total: number,\n * dropped: number,\n * corrupted: number,\n * droppedRate: number,\n * droppedDuration: number\n * } }\n */\n get videoFrameInfo () {\n const ret = {\n total: 0,\n dropped: 0,\n corrupted: 0,\n droppedRate: 0,\n droppedDuration: 0\n }\n if (!this.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.getVideoPlaybackQuality()\n ret.dropped = _quality.droppedVideoFrames || 0\n ret.total = _quality.totalVideoFrames || 0\n ret.corrupted = _quality.corruptedVideoFrames || 0\n if (ret.total > 0) {\n ret.droppedRate = (ret.dropped / ret.total) * 100\n ret.droppedDuration = parseInt(\n (this.cumulateTime / ret.total) * ret.dropped,\n 0\n )\n }\n return ret\n }\n\n /**\n * @type { string }\n */\n set lang (lang) {\n const result = I18N.langKeys.filter((key) => key === lang)\n if (result.length === 0 && lang !== 'zh') {\n console.error(\n `Sorry, set lang fail, because the language [${lang}] is not supported now, list of all supported languages is [${I18N.langKeys.join()}] `\n )\n return\n }\n this.config.lang = lang\n pluginsManager.setLang(lang, this)\n }\n\n get lang () {\n return this.config.lang\n }\n\n get i18n () {\n let _l = this.config.lang\n if (_l === 'zh') {\n _l = 'zh-cn'\n }\n return this.__i18n.lang[_l] || this.__i18n.lang.en\n }\n\n get i18nKeys () {\n return this.__i18n.textKeys || {}\n }\n\n /**\n * @type { string }\n */\n get version () {\n return version\n }\n\n /**\n * @type { number | string }\n */\n get playerId () {\n return this._pluginInfoId\n }\n\n /**\n * @type { any }\n */\n set url (url) {\n /**\n * @private\n */\n this.__url = url\n }\n\n get url () {\n return this.__url || this.config.url\n }\n\n /**\n * @type { string }\n */\n set poster (posterUrl) {\n this.plugins.poster && this.plugins.poster.update(posterUrl)\n }\n\n get poster () {\n return this.plugins.poster\n ? this.plugins.poster.config.poster\n : this.config.poster\n }\n\n get readyState () {\n return super.readyState\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n return super.networkState\n }\n\n /**\n * @type { boolean }\n */\n get fullscreenChanging () {\n return !(this._fullScreenOffset === null)\n }\n\n /**\n * 累计观看时长\n * @type { number }\n */\n get cumulateTime () {\n const { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\n }\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param {...any} args\n */\n runHooks (...args) {\n return runHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n if (Util.typeOf(isMuted) === Boolean) {\n /**\n * @type {boolean}\n */\n this.muted = isMuted\n }\n }\n instManager?.setActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\n// use the default instance manager.\nPlayer.instManager = InstManager.getInstance()\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","import Plugin from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport CssFullSceenSvg from '../assets/requestCssFull.svg'\nimport ExitCssFullSceenSvg from '../assets/exitCssFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * target: null | HTMLElement,\n * [propName: string]: any\n * } } ICssConfig\n */\n\nexport default class CssFullScreen extends IconPlugin {\n static get pluginName () {\n return 'cssFullscreen'\n }\n\n /**\n * @type ICssConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 1,\n disable: false,\n target: null\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.cssFullscreen === 'boolean') {\n args.config.disable = !args.player.config.cssFullscreen\n }\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class='xgplayer-cssfullscreen'>\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `<xg-icon class=\"xgplayer-back\">\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport TopBackIcon from './backicon'\nimport FullScreenSvg from '../assets/requestFull.svg'\nimport ExitFullScreenSvg from '../assets/exitFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position?: string,\n * index?: number,\n * useCssFullscreen?: boolean,\n * rotateFullscreen?: boolean,\n * useScreenOrientation?: boolean,\n * lockOrientationType?: OrientationType,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n useScreenOrientation: false, // Whether to use ScreenOrientation lock after requestFullScreen if ScreenOrientation available\n lockOrientationType: 'landscape', // Whether to lock screen if video width is greater than height\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e instanceof Event) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n\n if (config.useScreenOrientation) {\n this.unlockScreen()\n }\n } else {\n player.getFullscreen().catch(e => {})\n\n if (config.useScreenOrientation && player.aspectRatio > 1) {\n this.lockScreen(config.lockOrientationType)\n }\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n /**\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `<xg-icon class=\"xgplayer-fullscreen\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n\n /**\n * 锁定屏幕方向,只有部分移动端浏览器支持\n * 兼容性参考:https://caniuse.com/mdn-api_screenorientation_lock\n * @param {OrientationType} orientation\n */\n lockScreen (orientation) {\n try {\n screen.orientation.lock(orientation).catch(e => {})\n } catch (e) {\n }\n }\n\n /**\n * 解锁屏幕方向锁定,只有部分移动端浏览器支持\n */\n unlockScreen () {\n try {\n screen.orientation.unlock().catch(e => {})\n } catch (e) {\n }\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.listenEvents()\n this.animate(true)\n }\n\n listenEvents () {\n const { player } = this\n this.on([Events.PLAY, Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-play\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default Play\n","import { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDraggingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDraggingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n\n // 兼容旧版本\n if (typeof this.config.isDragingSeek === 'boolean') {\n console.warn('[XGPLAYER] \\'isDragingSeek\\' is deprecated, please use \\'isDraggingSeek\\' instead')\n this.config.isDraggingSeek = this.config.isDragingSeek\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDraggingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.listenEvents()\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adProgress.js\n */\n listenEvents () {\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n pos.isLocked = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n _getRootDocument () {\n return this.root?.ownerDocument || document\n }\n\n _addDragDocumentEvents () {\n const dragDocument = this._getRootDocument()\n this._dragDocument = dragDocument\n dragDocument.addEventListener('mousemove', this.onMouseMove, false)\n dragDocument.addEventListener('mouseup', this.onMouseUp, false)\n }\n\n _removeDragDocumentEvents () {\n const dragDocument = this._dragDocument || this._getRootDocument()\n dragDocument.removeEventListener('mousemove', this.onMouseMove, false)\n dragDocument.removeEventListener('mouseup', this.onMouseUp, false)\n this._dragDocument = null\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n this.root.addEventListener('touchcancel', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n this._addDragDocumentEvents()\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n if (!pos) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend' || eventType === 'touchcancel') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n this._removeDragDocumentEvents()\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 1)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n resetDragState () {\n const { pos, playerConfig, config } = this\n if (!pos) {\n return\n }\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n this._removeDragDocumentEvents()\n if (!pos.isDown && !this.isProgressMoving) {\n return\n }\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.removeClass(this.progressBtn, 'active')\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = false\n this._state.prePlayTime = 0\n this._state.time = 0\n this.resetSeekState()\n this.blur()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {number} currentTime 需要更新到的时间\n * @param {number} seekTime 实际seek的时间\n * @param {number} percent 更新时间占比\n * @param {number} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDraggingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n if(Number.isNaN(percent)){\n percent = this.player.currentTime / this.offsetDuration\n }\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n }\n\n destroy () {\n const { player } = this\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n this._removeDragDocumentEvents()\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n <xg-progress class=\"xgplayer-progress ${className}\">\n <xg-outer class=\"xgplayer-progress-outer\">\n <xg-progress-btn class=\"xgplayer-progress-btn\"></xg-progress-btn>\n </xg-outer>\n </xg-progress>\n `\n }\n}\n\nexport default Progress\n","import Plugin, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n\n this.listenEvents()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adTime.js\n */\n listenEvents () {\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(0))\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n this.extraEls = [this.centerCurDom, this.centerDurDom]\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking && player.media.seeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n // Math.ceil有精度问题,比如Math.ceil(0.55 * 100) == 56,因此这里使用Math.round\n // 0.58 * 100 === 57.99999999999999\n // 0.55 * 100 === 55.00000000000001\n $labelValue.innerText = muted ? 0 : Math.round(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n <xg-icon class=\"xgplayer-volume\" data-state=\"normal\">\n <div class=\"xgplayer-icon\">\n </div>\n <xg-slider class=\"xgplayer-slider\">\n ${isShowVolumeValue ? `<div class=\"xgplayer-value-label\">${volume * 100}</div>` : ''}\n <div class=\"xgplayer-bar\">\n <xg-drag class=\"xgplayer-drag\" style=\"height: ${volume * 100}%\"></xg-drag>\n </div>\n </xg-slider>\n </xg-icon>`\n }\n}\nexport default Volume\n","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `<xg-replay class=\"xgplayer-replay\">\n <xg-replay-txt class=\"xgplayer-replay-txt\" lang-key=\"${this.i18nKeys.REPLAY}\">${this.i18n.REPLAY}</xg-replay-txt>\n </xg-replay>`\n }\n}\nexport default Replay\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isEndedShow?: boolean, // 是否在播放结束之后显示\n * hideCanplay?: boolean, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n * poster?: string, // 封面图地址\n * useVideoPoster?: boolean // 是否使用video元素的poster属性设置封面(注意:原生poster填充方式固定为contain,fillMode不生效)\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n useVideoPoster: false, // 是否使用video元素的poster属性设置封面\n fillMode: 'fixWidth' // 封面图填充方式,fixWidth / fixHeight / cover / contain\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n if (!this.isHide) {\n if (!this.config.useVideoPoster) {\n Util.addClass(this.root, 'hide')\n }\n this.isHide = true\n }\n }\n\n /**\n * @returns\n */\n show () {\n this.isHide = false\n if (!this.config.useVideoPoster) {\n Util.removeClass(this.root, 'hide')\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n // 如果使用 video poster 属性,初始化时设置\n if (this.config.useVideoPoster && this.config.poster) {\n this.player.media.poster = this.config.poster\n }\n\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n this.show()\n }\n })\n\n this.on(Events.PLAYING, () => {\n this.hide()\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n this.show()\n if (!this.config.useVideoPoster) {\n Util.addClass(this.root, 'xg-showplay')\n }\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n })\n const { poster } = this.config\n this.update(poster)\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n if (this.config.useVideoPoster) {\n this.player.media.poster = poster\n } else {\n this.root.style.backgroundImage = `url(${poster})`\n }\n }\n\n getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'contain':\n _bg = 'contain'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden, useVideoPoster } = this.config\n if (useVideoPoster) {\n return ''\n }\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { playerConfig } = this\n\n this.initIcons()\n this.listenEvents()\n this.bindClickEvents()\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n }\n\n /**\n * @public\n * This method can be overridden.\n */\n listenEvents () {\n const { player, playerConfig } = this\n\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.toggleTo('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.toggleTo('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n }\n\n /**\n * @public\n */\n bindClickEvents () {\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.toggleTo('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n this._animateId = addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\n }\n\n /**\n * @public\n */\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n /**\n * @deprecated\n */\n onPlayPause (status) {\n this.toggleTo(status)\n }\n\n /**\n * @param {'play'|'pause'} status\n */\n toggleTo (status) {\n const { config, player } = this\n if (!player || player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n this.endAnimate()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <xg-start class=\"xgplayer-start ${className}\">\n <xg-start-inner></xg-start-inner>\n </xg-start>`\n }\n}\n\nexport default Start\n","import Plugin, { Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef { {\n * innerHtml?: string,\n * [propName: string]: any\n * } } IEnterConfig\n */\n\nclass Enter extends Plugin {\n static get pluginName () {\n return 'enter'\n }\n\n /**\n * @type IEnterConfig\n */\n static get defaultConfig () {\n return {\n innerHtml: '',\n logo: ''\n }\n }\n\n render () {\n const { innerHtml } = this.config\n const root = Util.createDom('xg-enter', '', {}, 'xgplayer-enter')\n\n if (innerHtml && innerHtml instanceof window.HTMLElement) {\n root.appendChild(innerHtml)\n } else if (innerHtml && typeof innerHtml === 'string') {\n root.innerHTML = innerHtml\n } else {\n let barStr = ''\n for (let i = 1; i <= 12; i++) {\n barStr += `<div class=\"xgplayer-enter-bar${i}\"></div>`\n }\n root.innerHTML = `<div class=\"xgplayer-enter-spinner\">${barStr}</div>`\n }\n return root\n }\n}\n\nexport default Enter\n","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n <xg-icon class=\"xgplayer-miniicon\">\n <div class=\"xgplayer-icon btn-text\"><span class=\"icon-text\" lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span></div>\n </xg-icon>`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !Number.isNaN(num)\n return isValid && num\n}\n\nconst measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n]\n\nconst measurementsLength = measurements.length\n\nfunction getZeroSize () {\n const size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n }\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n size[measurement] = 0\n }\n return size\n}\n\nfunction getStyle (elem) {\n const style = window.getComputedStyle(elem)\n // if ( !style ) {\n // logError( 'Style returned ' + style +\n // '. Are you running this code in a hidden iframe on Firefox? ' +\n // 'See http://bit.ly/getsizebug1' );\n // }\n return style\n}\n\nfunction getSize (elem) {\n // use querySeletor if elem is string\n if (typeof elem === 'string') {\n elem = document.querySelector(elem)\n }\n\n // do not proceed on non-objects\n if (!elem || typeof elem !== 'object' || !elem.nodeType) {\n return\n }\n\n const style = getStyle(elem)\n\n // if hidden, everything is 0\n if (style.display === 'none') {\n return getZeroSize()\n }\n\n const size = {}\n size.width = elem.offsetWidth\n size.height = elem.offsetHeight\n\n const isBorderBox = size.isBorderBox = style.boxSizing === 'border-box'\n\n // get all measurements\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n const value = style[measurement]\n const num = parseFloat(value)\n // any 'auto', 'medium' value will be 0\n size[measurement] = !Number.isNaN(num) ? num : 0\n }\n\n const paddingWidth = size.paddingLeft + size.paddingRight\n const paddingHeight = size.paddingTop + size.paddingBottom\n const marginWidth = size.marginLeft + size.marginRight\n const marginHeight = size.marginTop + size.marginBottom\n const borderWidth = size.borderLeftWidth + size.borderRightWidth\n const borderHeight = size.borderTopWidth + size.borderBottomWidth\n\n const isBorderBoxSizeOuter = isBorderBox// isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n const styleWidth = getStyleSize(style.width)\n if (styleWidth !== false) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)\n }\n\n const styleHeight = getStyleSize(style.height)\n if (styleHeight !== false) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)\n }\n\n size.innerWidth = size.width - (paddingWidth + borderWidth)\n size.innerHeight = size.height - (paddingHeight + borderHeight)\n\n size.outerWidth = size.width + marginWidth\n size.outerHeight = size.height + marginHeight\n\n return size\n}\n\nfunction getTouch (touches, dentifier) {\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n if (touch.identifier === dentifier) {\n return touch\n }\n }\n}\n\nconst EVENTS = {\n START: 'dragStart',\n MOVE: 'dragMove',\n ENDED: 'dragEnded'\n}\n\nconst POST_START_EVENTS = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n}\n\nexport default class Draggabilly extends EventEmitter {\n constructor (root, options = {}) {\n super()\n this.isEnabled = true\n this.isDragging = false\n this.isDown = false\n this.position = {}\n this.downPoint = {}\n this.dragPoint = { x: 0, y: 0 }\n this.startPos = { x: 0, y: 0 }\n // eslint-disable-next-line no-undef\n this._root = root instanceof Element ? root : document.querySelector(root)\n // eslint-disable-next-line no-undef\n this._handlerDom = options.handle instanceof Element ? options.handle : document.querySelector(options.handle)\n if (!this._root || !this._handlerDom) {\n return\n }\n // ['onDown', 'onUp', 'onMove', 'onCancel', 'onDocUp'].map(key => {\n // this[key] = this[key].bind(this)\n // })\n\n // if ('ontouchstart' in window) {\n // this._handlerKeys = TOUCH_HANDLERS\n // this._startKey = 'touchstart'\n // this._endKey = 'touchend'\n // } else {\n // this._handlerKeys = HANDLERS\n // this._startKey = 'mousedown'\n // this._endKey = 'mouseup'\n // }\n // this._handlerDom.addEventListener(this._startKey, this.onDown)\n this._bindStartEvent()\n }\n\n _bindStartEvent () {\n if ('ontouchstart' in window) {\n this._startKey = 'touchstart'\n } else {\n this._startKey = 'mousedown'\n }\n this[`on${this._startKey}`] = this[`on${this._startKey}`].bind(this)\n this._handlerDom.addEventListener(this._startKey, this[`on${this._startKey}`])\n POST_START_EVENTS[this._startKey].map(key => {\n this[`on${key}`] = this[`on${key}`].bind(this)\n })\n }\n\n _unbindStartEvent () {\n this._handlerDom.removeEventListener(this._startKey, this[`on${this._startKey}`])\n }\n\n _bindPostStartEvents (event) {\n if (!event) {\n return\n }\n const events = POST_START_EVENTS[this._startKey]\n // bind events to node\n events.map(eventName => {\n window.addEventListener(eventName, this[`on${eventName}`])\n })\n // save these arguments\n this._boundPointerEvents = events\n }\n\n _unbindPostStartEvents () {\n if (!this._boundPointerEvents) {\n return\n }\n this._boundPointerEvents.map(eventName => {\n // console.log('eventName', eventName, this[`on${eventName}`])\n window.removeEventListener(eventName, this[`on${eventName}`])\n })\n\n delete this._boundPointerEvents\n }\n\n enable () {\n this.isEnabled = true\n }\n\n disable () {\n this.isEnabled = false\n if (this.isDragging) {\n this.onUp()\n }\n }\n\n onDocUp (e) {\n this.onUp()\n }\n\n animate () {\n // only render and animate if dragging\n if (!this.isDragging) {\n return\n }\n\n this.positionDrag()\n\n window.requestAnimationFrame(() => {\n this.animate()\n })\n }\n\n positionDrag () {\n // this._root.style.transform = 'translate3d( ' + this.dragPoint.x +\n // 'px, ' + this.dragPoint.y + 'px, 0)';\n const transform = `translate3d(${this.dragPoint.x}px, ${this.dragPoint.y}px, 0)`\n this._root.style.transform = transform\n this._root.style.webKitTransform = transform\n }\n\n setLeftTop () {\n this._root.style.left = this.position.x + 'px'\n this._root.style.top = this.position.y + 'px'\n }\n\n onmousedown (e) {\n this.dragStart(e, e)\n }\n\n onmousemove (e) {\n this.dragMove(e, e)\n }\n\n onmouseup (e) {\n this.dragEnd(e, e)\n }\n\n ontouchstart (e) {\n const touch = e.changedTouches[0]\n this.dragStart(e, touch)\n this.touchIdentifier = touch.pointerId !== undefined\n ? touch.pointerId\n : touch.identifier\n e.preventDefault()\n }\n\n ontouchmove (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragMove(e, touch)\n }\n }\n\n ontouchend (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragEnd(e, touch)\n }\n e.preventDefault()\n }\n\n ontouchcancel (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragCancel(e, touch)\n }\n }\n\n dragStart (e, pointer) {\n if (!this._root || this.isDown || !this.isEnabled) {\n return\n }\n this.downPoint = pointer\n this.dragPoint.x = 0\n this.dragPoint.y = 0\n\n this._getPosition()\n\n const size = getSize(this._root)\n\n this.startPos.x = this.position.x\n this.startPos.y = this.position.y\n this.startPos.maxY = window.innerHeight - size.height\n this.startPos.maxX = window.innerWidth - size.width\n this.setLeftTop()\n\n this.isDown = true\n this._bindPostStartEvents(e)\n }\n\n dragRealStart (e, pointer) {\n this.isDragging = true\n this.animate()\n this.emit(EVENTS.START, this.startPos)\n }\n\n dragEnd (e, pointer) {\n if (!this._root) {\n return\n }\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this._root.style.transform = ''\n this.setLeftTop()\n this.emit(EVENTS.ENDED)\n }\n this.presetInfo()\n }\n\n _dragPointerMove (e, pointer) {\n const moveVector = {\n x: pointer.pageX - this.downPoint.pageX,\n y: pointer.pageY - this.downPoint.pageY\n }\n // 检测是否有移动\n if (!this.isDragging && this.hasDragStarted(moveVector)) {\n this.dragRealStart(e, pointer)\n }\n return moveVector\n }\n\n dragMove (e, pointer) {\n e = e || window.event\n if (!this.isDown) {\n return\n }\n const { x, y } = this.startPos\n const moveVector = this._dragPointerMove(e, pointer)\n let dragX = moveVector.x\n let dragY = moveVector.y\n dragX = this.checkContain('x', dragX, x)\n dragY = this.checkContain('y', dragY, y)\n this.position.x = x + dragX\n this.position.y = y + dragY\n this.dragPoint.x = dragX\n this.dragPoint.y = dragY\n this.emit(EVENTS.MOVE, this.position)\n }\n\n dragCancel (e, pointer) {\n this.dragEnd(e, pointer)\n }\n\n presetInfo () {\n this.isDragging = false\n this.startPos = {\n x: 0,\n y: 0\n }\n this.dragPoint = {\n x: 0,\n y: 0\n }\n this.isDown = false\n }\n\n destroy () {\n this._unbindStartEvent()\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this.dragEnd()\n }\n this.removeAllListeners()\n this._handlerDom = null\n }\n\n hasDragStarted (moveVector) {\n return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3\n }\n\n checkContain (axis, drag, grid) {\n if (drag + grid < 0) {\n return 0 - grid\n }\n\n if (axis === 'x' && drag + grid > this.startPos.maxX) {\n return this.startPos.maxX - grid\n }\n if (axis === 'y' && drag + grid > this.startPos.maxY) {\n return this.startPos.maxY - grid\n }\n return drag\n }\n\n _getPosition () {\n const style = window.getComputedStyle(this._root)\n const x = this._getPositionCoord(style.left, 'width')\n const y = this._getPositionCoord(style.top, 'height')\n // clean up 'auto' or other non-integer values\n this.position.x = Number.isNaN(x) ? 0 : x\n this.position.y = Number.isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n\n updatePos (pos) {\n this.pos = Object.assign(this.pos, pos)\n if (this.isMini) {\n this.player.root.style.left = `${this.pos.left}px`\n this.player.root.style.top = `${this.pos.top}px`\n this.player.root.style.width = `${this.pos.width}px`\n this.player.root.style.height = `${this.pos.height}px`\n }\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-mini-layer class=\"xg-mini-layer\">\n <xg-mini-header class=\"xgplayer-mini-header\">\n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\n </xg-mini-header>\n <div class=\"mini-cancel-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M3.99 3.49a1 1 0 0 1 1.414 0L10 8.085l4.596-4.595a1 1 0 1 1 1.414 1.414L11.414 9.5l4.596 4.596a1 1 0 0 1 .084 1.32l-.084.094a1 1 0 0 1-1.414 0L10 10.914 5.404 15.51a1 1 0 0 1-1.414-1.414L8.585 9.5 3.99 4.904a1 1 0 0 1-.084-1.32z\"></path>\n </svg>\n </div>\n <div class=\"play-icon\">\n </div>\n </xg-mini-layer>`\n }\n}\n\nexport {\n MiniScreen as default,\n MiniScreenIcon\n}\n","import { BasePlugin, Sniffer } from '../../plugin'\nimport { runHooks } from '../../plugin/hooksDescriptor'\nimport { LEAVE_PLAYER, ENTER_PLAYER } from '../../events'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n /**\n * 检查Mobile插件是否正在处理touch事件,如果其正在处理touch事件,则不响应mouse事件\n * @returns {boolean}\n * @private\n */\n _isMobileTouchActive() {\n const mobilePlugin = this.player?.plugins?.mobile\n return !!mobilePlugin && mobilePlugin._isTouchActive === true\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseMove = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseEnter = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n this.emit(ENTER_PLAYER)\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseLeave = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur({ignorePaused: true})\n }\n }\n this.emit(LEAVE_PLAYER)\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n root.removeEventListener('click', this.onVideoClick, false)\n root.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n /**\n * @type { null | number}\n */\n this.pressIntrvalId = null\n /**\n * @type { null | number}\n */\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart = (e) => {\n const { _pos, root } = this\n // config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel = (e) => {\n this.onTouchEnd(e)\n }\n\n onTouchEnd = (e) => {\n const { _pos, root } = this\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove = (e) => {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the left\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n /**\n * 标记touch事件状态,供PC插件使用\n * @private\n */\n this._isTouchActive = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n player.root.addEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.addEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.addEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.addEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration > 0 && player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n });\n ['dragend', 'click'].forEach(key => {\n progressPlugin.addCallBack(key, () => {\n this.changeAction(ACTIONS.AUTO)\n })\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor, timePreviewStyle, curTimeColor, durationColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n }\n if (timePreviewStyle) {\n const previewDom = this.find('.time-preview')\n Object.keys(timePreviewStyle).forEach(key => {\n previewDom.style[key] = timePreviewStyle[key]\n })\n }\n const curColor = curTimeColor || playedColor\n const durColor = durationColor\n curColor && (this.find('.xg-cur').style.color = curColor)\n durColor && (this.find('.xg-dur').style.color = durColor)\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n\n // 标记touch事件状态\n this._isTouchActive = true\n if (this.touchActiveTimer) {\n clearTimeout(this.touchActiveTimer)\n this.touchActiveTimer = null\n }\n\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n this.timer && clearTimeout(this.timer)\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n // e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n\n // 延迟重置touch事件状态,确保后续的mouse事件被忽略\n if (this.touchActiveTimer) {\n clearTimeout(this.touchActiveTimer)\n }\n this.touchActiveTimer = setTimeout(() => {\n this._isTouchActive = false\n }, 10)\n\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.scope > -1) {\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n const { pos, config, xgMask } = this\n if (!config.darkness) {\n return\n }\n if (this.player.rotateDeg) {\n percent = -percent\n }\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = true\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = false\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n player.root.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.removeEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.removeEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n <xg-trigger class=\"trigger\">\n <div class=\"${className}\"></div>\n <div class=\"time-preview\">\n <div class=\"xg-seek-show ${this.config.disableSeekIcon ? ' hide-seek-icon' : ''}\">\n <i class=\"xg-seek-icon\"></i>\n <span class=\"xg-cur\">00:00</span>\n <span class=\"xg-separator\">/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: false, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'pressAction', 'disablePress', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n setConfig (newConfig) {\n Object.keys(newConfig).forEach(key => {\n this.config[key] = newConfig[key]\n })\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n if (player.volume <= 0) {\n return\n }\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n if (player.volume >= 1) {\n return\n }\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n event.stopPropagation()\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\n }\n}\n\nexport default Loading\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\n}","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this._clickTimeStamp = 0\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\n\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n const now = Date.now()\n if (now - this._clickTimeStamp < 300) {\n return\n }\n this._clickTimeStamp = now\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n * @doc https://wicg.github.io/document-picture-in-picture/\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false,\n preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.media.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n player.plugins?.progress?.resetDragState?.()\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : false\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function')) ||\n this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\n `\n }\n}\n","// Refactored from download.js,to support custom request headers, cookies, etc.\n//\n// download.js copyright:\n// Copyright (c) 2013-2023 RNDme\n// https://github.com/rndme/download\n// MIT License\n// https://github.com/rndme/download/blob/master/LICENSE\n\nimport Sniffer from '../../utils/sniffer'\n\n/**\n * Enhanced saveAs function with authentication support\n * @typedef {Object} SaveAsOptions\n * @property {string} [fileName] - The name of the file to save\n * @property {string} [mimeType] - The MIME type of the file\n * @property {Object} [headers] - Custom headers for the request\n * @property {boolean} [withCredentials] - Whether to send cookies with the request\n * @property {number} [timeout] - Request timeout in milliseconds\n * @property {Function} [beforeRequest] - Function to call before the request is made\n */\n\n/**\n * Default configuration for saveAs\n */\nconst DEFAULT_CONFIG = {\n mimeType: 'application/octet-stream', // this default mime also triggers iframe downloads\n fileName: 'download',\n timeout: 30000\n}\n\n/**\n * Browser detection utilities\n */\nconst BrowserUtils = {\n /**\n * Check if the browser supports Blob\n */\n supportsBlob () {\n return typeof Blob !== 'undefined'\n },\n\n /**\n * Check if the browser supports URL.createObjectURL\n */\n supportsObjectURL () {\n return typeof URL !== 'undefined' && URL.createObjectURL\n },\n\n /**\n * Check if the browser is Safari\n */\n isSafari () {\n return Sniffer.browser === 'safari'\n },\n\n /**\n * Check if the browser is IE and supports msSaveBlob\n */\n isIEWithMsSaveBlob () {\n return navigator.msSaveBlob\n },\n\n /**\n * Check if the browser supports HTML5 download attribute\n */\n supportsDownloadAttribute () {\n const anchor = document.createElement('a')\n return 'download' in anchor\n }\n}\n\n/**\n * Data URL utilities\n */\nconst DataURLUtils = {\n /**\n * Check if a string is a data URL\n */\n isDataURL (str) {\n return /^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(str)\n },\n\n /**\n * Convert data URL to Blob\n */\n dataURLToBlob (dataURL) {\n const parts = dataURL.split(/[:;,]/)\n const type = parts[1]\n const indexDecoder = dataURL.indexOf('charset') > 0 ? 3 : 2\n const decoder = parts[indexDecoder] === 'base64' ? atob : decodeURIComponent\n const binData = decoder(parts.pop())\n const uiArr = new Uint8Array(binData.length)\n\n for (let i = 0; i < binData.length; i++) {\n uiArr[i] = binData.charCodeAt(i)\n }\n\n // Use compatible Blob constructor\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n return new BlobConstructor([uiArr], { type })\n },\n\n /**\n * Check if string contains non-ASCII characters\n */\n hasNonASCII (str) {\n return /([\\x80-\\xff])/.test(str)\n },\n\n /**\n * Convert string with non-ASCII characters to Uint8Array\n */\n stringToUint8Array (str) {\n const arr = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i)\n }\n return arr\n }\n}\n\n/**\n * File download utilities\n */\nconst DownloadUtils = {\n /**\n * Create and trigger download using HTML5 download attribute\n */\n downloadWithAnchor (url, fileName) {\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.setAttribute('download', fileName)\n anchor.className = 'download-js-link'\n anchor.innerHTML = 'downloading...'\n anchor.style.display = 'none'\n\n // Add click event listener to prevent event bubbling\n const clickHandler = function (e) {\n e.stopPropagation()\n this.removeEventListener('click', clickHandler)\n }\n anchor.addEventListener('click', clickHandler)\n\n document.body.appendChild(anchor)\n\n setTimeout(() => {\n anchor.click()\n document.body.removeChild(anchor)\n // Clean up object URL after a short delay\n if (url.startsWith('blob:')) {\n setTimeout(() => URL.revokeObjectURL(url), 250)\n }\n }, 66)\n\n return true\n },\n\n /**\n * Handle Safari download (fallback method)\n */\n downloadWithSafari (url, fileName) {\n // Convert Blob to data URL if needed\n if (url instanceof Blob) {\n const reader = new FileReader()\n reader.onload = function (e) {\n const dataURL = e.target.result\n DownloadUtils.downloadWithSafari(dataURL, fileName)\n }\n reader.readAsDataURL(url)\n return true\n }\n\n if (DataURLUtils.isDataURL(url)) {\n url = 'data:' + url.replace(/^data:([\\w\\/\\-\\+]+)/, DEFAULT_CONFIG.mimeType)\n }\n\n if (!window.open(url)) {\n const confirmed = confirm(\n 'Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.'\n )\n if (confirmed) {\n location.href = url\n }\n }\n\n return true\n },\n\n /**\n * Download using iframe (legacy browsers)\n */\n downloadWithIframe (url, fileName) {\n // Convert Blob to data URL if needed\n if (url instanceof Blob) {\n const reader = new FileReader()\n reader.onload = function (e) {\n const dataURL = e.target.result\n DownloadUtils.downloadWithIframe(dataURL, fileName)\n }\n reader.readAsDataURL(url)\n return true\n }\n\n const iframe = document.createElement('iframe')\n document.body.appendChild(iframe)\n\n if (DataURLUtils.isDataURL(url)) {\n url = 'data:' + url.replace(/^data:([\\w\\/\\-\\+]+)/, DEFAULT_CONFIG.mimeType)\n }\n\n iframe.src = url\n setTimeout(() => document.body.removeChild(iframe), 333)\n\n return true\n }\n}\n\n/**\n * HTTP request utilities\n */\nconst RequestUtils = {\n /**\n * Create XMLHttpRequest with authentication support\n */\n createRequest (url, options = {}) {\n const xhr = new XMLHttpRequest()\n\n // Set timeout\n if (options.timeout) {\n xhr.timeout = options.timeout\n }\n\n // Set credentials\n if (typeof options.withCredentials === 'boolean') {\n xhr.withCredentials = options.withCredentials\n }\n\n return xhr\n },\n\n /**\n * Set custom headers on XMLHttpRequest\n */\n setHeaders (xhr, headers = {}) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value)\n })\n },\n\n /**\n * Download file from URL with authentication\n */\n downloadFromURL (url, fileName, options = {}) {\n return new Promise((resolve, reject) => {\n const xhr = RequestUtils.createRequest(url, options)\n\n xhr.open('GET', url, true)\n xhr.responseType = 'blob'\n\n // Set custom headers\n if (options.headers) {\n RequestUtils.setHeaders(xhr, options.headers)\n }\n\n if (options.withCredentials) {\n xhr.withCredentials = true\n }\n\n xhr.onload = function (e) {\n if (e.target.status === 200) {\n saveAs(e.target.response, fileName, options.mimeType || DEFAULT_CONFIG.mimeType)\n resolve(e.target.response)\n } else {\n reject(new Error(`HTTP ${e.target.status}: ${e.target.statusText}`))\n }\n }\n\n xhr.onerror = function () {\n reject(new Error('Network error occurred'))\n }\n\n xhr.ontimeout = function () {\n reject(new Error('Request timeout'))\n }\n\n if (options.beforeRequest) {\n options.beforeRequest(xhr)\n }\n\n // Use setTimeout to allow setting custom headers\n setTimeout(() => xhr.send(), 0)\n })\n }\n}\n\n/**\n * Main saveAs function\n * @param {string|Blob|ArrayBuffer} data - The data to save or URL to download\n * @param {string|SaveAsOptions} [fileNameOrOptions] - File name or options object\n * @param {string} [mimeType] - MIME type (used when fileNameOrOptions is string)\n * @returns {boolean|Promise} - Returns true for immediate downloads, Promise for async downloads\n */\nexport function saveAs (data, fileNameOrOptions, mimeType) {\n // Handle different parameter patterns\n let options = {}\n let fileName = DEFAULT_CONFIG.fileName\n let actualMimeType = DEFAULT_CONFIG.mimeType\n\n if (typeof fileNameOrOptions === 'string') {\n // Legacy API: saveAs(data, fileName, mimeType)\n fileName = fileNameOrOptions || DEFAULT_CONFIG.fileName\n actualMimeType = mimeType || DEFAULT_CONFIG.mimeType\n } else if (typeof fileNameOrOptions === 'object' && fileNameOrOptions !== null) {\n // New API: saveAs(data, options)\n options = { ...DEFAULT_CONFIG, ...fileNameOrOptions }\n fileName = options.fileName || DEFAULT_CONFIG.fileName\n actualMimeType = options.mimeType || DEFAULT_CONFIG.mimeType\n }\n\n // Handle reverse arguments pattern (legacy support)\n if (String(this) === 'true') {\n const temp = data\n data = fileNameOrOptions\n fileNameOrOptions = temp\n actualMimeType = mimeType || DEFAULT_CONFIG.mimeType\n }\n\n // Handle URL downloads\n if (typeof data === 'string' && !fileNameOrOptions && !mimeType && data.length < 2048) {\n const url = data\n const extractedFileName = url.split('/').pop().split('?')[0]\n fileName = extractedFileName || DEFAULT_CONFIG.fileName\n\n // Check if it's a valid URL\n const anchor = document.createElement('a')\n anchor.href = url\n if (anchor.href.indexOf(url) !== -1) {\n return RequestUtils.downloadFromURL(url, fileName, options)\n }\n }\n\n // Handle data URLs\n if (DataURLUtils.isDataURL(data)) {\n if (data.length > 1024 * 1024 * 1.999 && BrowserUtils.supportsBlob()) {\n const blob = DataURLUtils.dataURLToBlob(data)\n actualMimeType = blob.type || actualMimeType\n return saveAs(blob, fileName, actualMimeType)\n } else {\n return BrowserUtils.isIEWithMsSaveBlob()\n ? navigator.msSaveBlob(DataURLUtils.dataURLToBlob(data), fileName)\n : DownloadUtils.downloadWithAnchor(data, fileName)\n }\n }\n\n // Handle string data with non-ASCII characters\n if (typeof data === 'string' && DataURLUtils.hasNonASCII(data)) {\n const uint8Array = DataURLUtils.stringToUint8Array(data)\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n data = new BlobConstructor([uint8Array], { type: actualMimeType })\n }\n\n // Ensure data is a Blob with proper constructor fallback\n let blob\n if (data instanceof Blob) {\n blob = data\n } else {\n // Handle different Blob constructors for compatibility\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n blob = new BlobConstructor([data], { type: actualMimeType })\n }\n\n // Handle IE with msSaveBlob\n if (BrowserUtils.isIEWithMsSaveBlob()) {\n return navigator.msSaveBlob(blob, fileName)\n }\n\n // Handle modern browsers with URL.createObjectURL\n if (BrowserUtils.supportsObjectURL()) {\n const objectURL = URL.createObjectURL(blob)\n return DownloadUtils.downloadWithAnchor(objectURL, fileName)\n }\n\n // Handle Safari fallback\n if (BrowserUtils.isSafari()) {\n return DownloadUtils.downloadWithSafari(blob, fileName)\n }\n\n // Handle browsers without URL support\n if (typeof blob === 'string' || blob.constructor === String) {\n try {\n const dataURL = 'data:' + actualMimeType + ';base64,' + btoa(blob)\n return DownloadUtils.downloadWithAnchor(dataURL, fileName)\n } catch (e) {\n const dataURL = 'data:' + actualMimeType + ',' + encodeURIComponent(blob)\n return DownloadUtils.downloadWithAnchor(dataURL, fileName)\n }\n }\n\n // Handle Blob without URL support using FileReader\n const reader = new FileReader()\n reader.onload = function (e) {\n DownloadUtils.downloadWithAnchor(e.target.result, fileName)\n }\n reader.readAsDataURL(blob)\n\n // Fallback to iframe for legacy browsers\n return DownloadUtils.downloadWithIframe(blob, fileName)\n}\n\n/**\n * Enhanced saveAs with authentication support\n * @param {string} url - URL to download from\n * @param {SaveAsOptions} options - Download options including authentication\n * @returns {Promise<Blob>} - Promise that resolves with the downloaded blob\n */\nexport function saveAsWithAuth (url, options = {}) {\n const config = { ...DEFAULT_CONFIG, ...options }\n const fileName = config.fileName || url.split('/').pop().split('?')[0] || 'download'\n\n return RequestUtils.downloadFromURL(url, fileName, config)\n}\n","import { POSITIONS, Util } from '../../plugin'\nimport DownloadSvg from '../assets/download.svg'\nimport IconPlugin from '../common/iconPlugin'\nimport { xgIconTips } from '../common/iconTools'\nimport { saveAsWithAuth } from './saveAs'\n\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * saveAsOptions: import('./saveAs').SaveAsOptions,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true,\n saveAsOptions: {}\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n saveAsWithAuth(newUrl, Object.assign({}, this.config.saveAsOptions || {}))\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `<a href=\"${url}\">x</a>`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n saveImg: true,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n\n let event\n try {\n if (typeof MouseEvent !== 'undefined') {\n event = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n })\n } else {\n event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n }\n } catch (e) {\n console.error('MouseEvent unsupported', e)\n }\n\n if (event) {\n saveLink.dispatchEvent(event)\n }\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n <xg-icon class=\"xgplayer-shot\">\n <div class=\"${className}\">\n ${this.icons.screenshotIcon ? '' : `<span lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span>`}\n </div>\n </xg-icon>`\n }\n}\n","import Plugin, { Util } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = this.config.domEventType === 'touch' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `<span>${item.showText}</span>`, item, className))\n })\n }\n\n onItemClick (e) {\n if (!e.delegateTarget) {\n e.delegateTarget = e.target\n }\n const target = e.delegateTarget\n if (target && Util.hasClass(target, 'selected')) {\n return false\n }\n const changeCallback = typeof this.config.onItemClick === 'function' ? this.config.onItemClick : null\n const curSelected = this.root.querySelector('.selected')\n Util.addClass(target, 'selected')\n curSelected && Util.removeClass(curSelected, 'selected')\n changeCallback(e, {\n from: curSelected ? this.getAttrObj(curSelected, this.attrKeys) : null,\n to: this.getAttrObj(target, this.attrKeys)\n })\n }\n\n getAttrObj (dom, keys) {\n if (!dom || !keys) {\n return {}\n }\n const obj = {}\n keys.map(key => {\n obj[key] = dom.getAttribute(key)\n })\n const index = dom.getAttribute('data-index')\n if (index) {\n obj.index = Number(index)\n }\n return obj\n }\n\n\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle',\n DEFAULT: 'default'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nlet IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'default', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n IS_MOBILE = IS_MOBILE || this.domEventType === 'touch'\n if (IS_MOBILE && Sniffer.device === 'mobile' && config.listType === LIST_TYPES.DEFAULT) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive || this.config.disable) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n },\n domEventType: IS_MOBILE ? 'touch' : 'mouse'\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `<xg-icon class=\"xg-options-icon ${this.config.className || ''}\">\n <div class=\"xgplayer-icon\">\n </div>\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<IDefinition>,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<number | { [propName: string]: any }>,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, _data) {\n super.onItemClick(e, _data)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import Plugin, { Events } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}<span class=\"xgplayer-error-refresh\">${this.i18n.REFRESH}</span>`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `<xg-error class=\"xgplayer-error\">\n <div class=\"xgplayer-errornote\">\n <span class=\"xgplayer-error-text\"></span>\n <span class=\"xgplayer-error-tips\"><em class=\"xgplayer-error-refresh\"></em></span>\n </div>\n </xg-error>`\n }\n}\n","import Plugin, { STATE_CLASS, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * 消息组件\n */\nclass Prompt extends Plugin {\n static get pluginName () {\n return 'prompt'\n }\n\n static get defaultConfig () {\n return {\n interval: 3000,\n style: {},\n mode: 'arrow',\n autoHide: true,\n detail: {\n text: '',\n highlight: ''\n },\n onClick: () => {\n }\n }\n }\n\n afterCreate () {\n /**\n * @type {number}\n */\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.showPrompt(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n showPrompt (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n this.positionDot(dotDom, iSpot.id)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n this._updateDotDom(iSpot, dotDom)\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this.ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.forEach((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin.ispotsInit = false\n plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver',\n mouseenter: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n\n if (progress) {\n // Make sure the mouse event is unlocked, otherwise the progress bar will still slide\n progress.onMouseUp(e)\n }\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault();\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `<div class=\"xg-spot-info hide ${this.config.mode === 'short' ? 'short-line' : ''}\">\n <div class=\"xg-spot-content\">\n <div class=\"xg-spot-thumbnail\">\n <span class=\"xg-spot-time\"></span>\n </div>\n <div class=\"xg-spot-text\"><span class=\"spot-inner-text\"></span></div>\n </div>\n <div class=\"xgplayer-progress-point\">00:00</div>\n <div class=\"xg-spot-ext-text\"></div>\n <div class=\"xg-spot-line\"></div>\n </div>`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array<string>, // 有多张大图就多个url\n * pic_num?: number, // 每张图含有几个雪碧图\n * col?: number, // 截图列数\n * row?: number, // 截图行数\n * height?: number, // 缩略图高度\n * width?: number, // 缩略图宽度\n * scale?: number, // 缩放\n * className?: string, // 额外添加在dom上的class\n * hidePortrait?: boolean, // 是否在竖屏的时候隐藏\n * [propName: string]: any\n * }} IThumbnailConfig\n */\nexport default class Thumbnail extends BasePlugin {\n static get pluginName () {\n return 'thumbnail'\n }\n\n /**\n * @type IThumbnailConfig\n */\n static get defaultConfig () {\n return {\n isShow: false,\n urls: [], // 有多张大图就多个url就好\n pic_num: 0, // 每张图含有几个雪碧图\n col: 0, // 截图列数\n row: 0, // 截图行数\n height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = config[key]\n })\n this.usable && this.initThumbnail()\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\n // this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n this.interval = Math.round(this.player.duration / pic_num)\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = '') {\n const { pic_num, urls } = this.config\n if (pic_num <= 0 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n this.setConfig(newConfig)\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {\n mode: 'auto',\n height: 2\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n afterCreate () {\n if (!this.root) {\n return\n }\n this.on(Events.TIME_UPDATE, this.onTimeupdate)\n this.on(Events.EMPTIED, () => {\n this.reset()\n })\n }\n\n onTimeupdate = () => {\n const { ended } = this.player\n const { offsetDuration } = this\n let time = this.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, ended)\n this.update({ played: time }, offsetDuration)\n }\n\n reset () {\n this.update({ played: 0, cached: 0 }, 0)\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n const { commonStyle, miniprogress } = this.playerConfig\n if (!miniprogress) {\n return\n }\n const { mode, height } = this.config\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n height: height > 0 && height !== 2 ? `height: ${height}px;` : ''\n }\n const stateClass = mode === 'show' ? 'xg-mini-progress-show' : ''\n return `<xg-mini-progress class=\"xg-mini-progress ${stateClass}\" style=\"${_style.progress} ${_style.height}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n index: -1,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode, frameRate } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n\n this._isLoaded = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && Util.isMSE(_tVideo))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n // console.log('>>>updateImg update', image, pi)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_pos.height = this.canvas.height = height)\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n document.removeEventListener('visibilitychange', this.onVisibilitychange)\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n /**\n * @type {null | number}\n */\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5, // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n /**\n * @type {null || number }\n */\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 卡住次数\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n const media = player.media || player.video\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkBuffer (curTime, buffered) {\n let enoughBuffer = false\n const buffers = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n buffers.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n return {\n enoughBuffer,\n buffers\n }\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const media = this.player.media || this.player.video\n const hidden = document.hidden\n const { paused, readyState, currentTime, buffered } = media\n\n if (hidden || paused || readyState < 4) {\n return\n }\n const { enoughBuffer, buffers } = this._checkBuffer(currentTime, buffered)\n if (!enoughBuffer) {\n return\n }\n\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ currentTime, buffers, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n\n if (this._currentStuckCount >= this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n }\n } else {\n this._reset()\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n const media = this.player.media || this.player.video\n if (!media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = media.getVideoPlaybackQuality()\n\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport TimeSegments from '../plugins/time/timesegments'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [TimeSegments, Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n TEXTTRACK_OFF: '关闭',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Errors from './error'\nimport * as Events from './events'\nimport './index.scss'\nimport { InstManager } from './instManager'\nimport I18N from './lang/i18n'\nimport Player from './player'\nimport BasePlugin from './plugin/basePlugin'\nimport Plugin from './plugin/plugin'\nimport { default as CssFullscreenIcon } from './plugins/cssFullScreen'\nimport { default as FullscreenIcon } from './plugins/fullscreen'\nimport { default as PlayIcon } from './plugins/play'\nimport { default as Progress } from './plugins/progress'\nimport { default as TimeIcon } from './plugins/time'\nimport { default as VolumeIcon } from './plugins/volume'\nimport defaultPreset from './presets/default'\nimport STATE_CLASS from './stateClassMap'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n static InstManager = InstManager\n\n // UI Exports\n static PlayIcon = PlayIcon // For Ads Plugin\n static TimeIcon = TimeIcon // For Ads Plugin\n static Progress = Progress // For Ads Plugin\n static FullscreenIcon = FullscreenIcon // For Ads Plugin\n static CssFullscreenIcon = CssFullscreenIcon // For Ads Plugin\n static VolumeIcon = VolumeIcon // For Ads Plugin\n}\n\nexport default PresetPlayer\n"],"names":["version","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","arguments","length","optionalParams","Array","_key","this","console","log","apply","concat","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","i","len","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","max","cancel","id","clearTimeout","cancelTimer","flush","pending","throttle","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","Object","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","prototype","some","call","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","push","map","join","findDom","sel","querySelector","getElementById","slice","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","event","touches","touch","changedTouches","clientX","clientY","offsetX","pageX","target","offsetLeft","offsetY","pageY","offsetTop","_target","srcElement","obj","toString","deepCopy","dst","src","Node","deepMerge","_dst$key","_toConsumableArray","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","name","setInterval","context","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","media","HTMLMediaElement","currentSrc","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","fn","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","LEAVE_PLAYER","ENTER_PLAYER","LOADING","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","has","hasOwnProperty","prefix","Events","EE","once","addListener","emitter","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","store","instance","InstManager","_EventEmitter","_inherits","_super","_createSuper","playerId","setActive","isUserActive","endEarly","_iterate","flag","isActive","inst","isInstNext","isNext","XGI18nLang","lang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","timeout","other","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","NETWORK_EMPTY","NETWORK_IDLE","NETWORK_LOADING","NETWORK_NO_SOURCE","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","PLAY_TIPS","PAUSE_TIPS","PLAYNEXT_TIPS","DOWNLOAD_TIPS","ROTATE_TIPS","RELOAD_TIPS","FULLSCREEN_TIPS","EXITFULLSCREEN_TIPS","CSSFULLSCREEN_TIPS","EXITCSSFULLSCREEN_TIPS","TEXTTRACK","TEXTTRACK_OFF","PIP","SCREENSHOT","LIVE","OFF","OPEN","MINI_DRAG","MINISCREEN","REFRESH_TIPS","REFRESH","FORWARD","LIVE_TIP","I18N","zh","extend","i18nTextList","_i18nLangs","init","_ret$langKeys","pId","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isTizen","isWebOS","isHarmonyOS","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","mediaEl","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","_c","_videoSourceCount","_videoSourceIndex","_eHandler","_sourceError","_dIndex","removeChild","_this7","removeAttribute","load","assembleSource","_vLoadeddata","disassembleSource","_e","srcObject","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","videoWidth","videoHeight","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","preRet","runHooks","isContinue","catch","findHookIndex","isArray","hookHandlers","useHooks","removeHooks","hooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","presetHooks","defineProperty","delHooksDescriptor","_len5","_key5","runHooksRecursive","_len6","_key6","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","i18nKeys","domEventType","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","configurable","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","xgIconTips","textKey","isShow","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","PLUGIN_STATE_CLASS","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","extraEls","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","disable","find","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","__trigger","observe","_pid","_this$observer","unobserve","_this$observer2","disconnect","resizeObserver","pluginsManager","pluginGroup","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","_originalOptions","_plugins","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","race","loader","__esModule","default","register","_","reject","originalOptions","isSupported","codecType","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","condition","cName","beforeInit","retPromise","_player$_loadingPlugi","prevTask","_loadingPlugins","all","pluginsRet","pName","_plugins$pName","beforePlayerInit","afterInit","_plugins$pName2","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","unObserver","_resizeObserver","_i","_Object$keys","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","PLAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","instManager","Player","_MediaProxy","_this$onReady","__startTime","_seekToStartTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","handleSource","_state","isAd","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_instManager","vid","line","handle","p","checkPlayerRoot","_initBaseDoms","_root","_this$config3","_width","_height","_this$root$getBoundin","getBoundingClientRect","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","playSessionId","_playSessionId","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","_this8","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_this$controls","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this9","_furl","_startInit","fileName","lineNumber","_this10","_src","curTime","isPaused","_error","_canplay","_this11","playPromise","onError","_errorTimer","_this12","_this13","status","_this14","_this$config4","isSeekedPlay","_status","_this15","_this$config5","_this16","bitrate","switchURL","seamless","reloadFunc","_this17","clsList","mediaPause","cls","_this18","unregisterPlugins","isResetConfig","resetState","pn","de","_instManager2","_this19","updateAcc","_unbindEvents","exitFullscreen","remainMediaAfterDestroy","cList","_this20","onPlay","_this21","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","isRotate90","orientation","screen","angle","innerWidth","innerHeight","deg","delay","onFocus","_clearUserTimer","onBlur","_this22","isLock","_ref","_ref$ignorePaused","_this23","_this24","_this25","endType","_at","startDiff","endDiff","_ref2","_ref2$startDiff","_ref2$endDiff","_this26","_this$videoPos","_pi","_pos","offsetWidth","offsetHeight","rHeight","rWidth","maxWidth","maxHeight","formStyle","transform","webkitTransform","resizePosition","_this27","setConfig","_this28","_this29","containerSize","_this$media","_this$config6","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","_this$config7","preProcessUrlOptions","processUrlOptions","bool","_this30","curDef","targetDef","_this30$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","_instManager3","addInnerOP","Boolean","_instManager4","getActiveId","_instManager5","descriptor","getInstance","Icon","_onMouseenter","_onMouseLeave","CssFullScreen","_IconPlugin","initIcons","isCssfullScreen","animate","btnClick","handleCssFullscreen","preventDefault","contentIcon","getCssFullscreen","switchTips","tipDom","changeLangTextKey","CssFullSceenSvg","ExitCssFullSceenSvg","IconPlugin","TopBackIcon","onClick","screenBack","BackSVG","Fullscreen","rotateFullscreen","getFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getRotateFullscreen","switchCallback","useScreenOrientation","unlockScreen","aspectRatio","lockScreen","lockOrientationType","lock","unlock","Play","replay","listenEvents","PlaySvg","PauseSvg","TPL","styleKey","InnerList","fragments","percent","_callBack","actionCallback","fragConfig","fragFocusClass","fragAutoFocus","fragClass","cachedIndex","playedIndex","focusIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","newPIndex","findIndex","unHightLight","setHightLight","_data","preIndex","fragment","cached","updateDuration","updateProgress","newCIndex","newOptions","_this$fragConfig","inner","isFocus","FRAGMENT_FOCUS_CLASS","POINT","HIGHLIGHT","Progress","_ePos","moving","miniMoveStep","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","_assertThisInitialize3","forward","isDown","isPauseMoving","_assertThisInitialize4","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_addDragDocumentEvents","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","_removeDragDocumentEvents","isEnter","resetSeekState","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","_this$pos","useable","__dragCallBacks","direc","_disableBlur","isDragingSeek","isDraggingSeek","offsetDuration","offsetCurrentTime","innerList","reset","outer","updateFocus","_initInner","isMobile","bindDomEvents","initCustomStyle","onTimeupdate","onCacheUpdate","onReset","onVideoResize","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","_this$root","ownerDocument","dragDocument","_getRootDocument","_dragDocument","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","toFixed","updatePercent","updateTime","seek","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Time","isActiving","_this$player2","constrolsMode","createCenterTime","durationDom","timeDom","onTimeUpdate","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isStart","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","_this$playerConfig","backgroundColor","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","drag","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","newPointTime","loadedCostTime","startCostTime","_isSeeking","seekingStart","waitingStart","fixedWaitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","fixedStart","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","waitTimeout","_now","_cost","_fixedCost","fixedCostTime","Replay","ReplaySvg","__handleReplay","path","Poster","isEndedShow","isHide","useVideoPoster","hideCanplay","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","toggleTo","bindClickEvents","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","startPause","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","Enter","innerHtml","HTMLElement","barStr","logo","MiniScreenIcon","getMini","exitMini","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","outerWidth","outerHeight","getZeroSize","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","axis","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isClose","scrollY","scrollHeight","lastStyle","isShowIcon","onCancelClick","onCenterClick","disableDrag","_draggabilly","isScrollSwitch","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","_isMobileTouchActive","stopImmediatePropagation","_assertThisInitialize2","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","initEvents","onVideoClick","onVideoDblClick","onContextmenu","_this$player2$plugins","mobilePlugin","mobile","_isTouchActive","returnValue","cancelBubble","_this$player3","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","touchActiveTimer","disableGesture","timer","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetPos","changeAction","checkIsRootTarget","light","seekTipIcon","SeekTipIcon","closedbClick","xgMask","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","usable","createThumbnail","timePreview","timePreviewStyle","curTimeColor","durationColor","previewDom","curColor","durColor","color","disableTimeProgress","startPlugin","recover","mold","updateBrightness","updateVolume","lastScope","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","isTouchingSeek","darkness","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","newConfig","checkVisible","rec","bottom","isBodyTarget","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Rotate","onBtnClick","_clickTimeStamp","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","_player$plugins","_player$plugins$progr","_player$plugins$progr2","resetDragState","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","DEFAULT_CONFIG","mimeType","BrowserUtils","Blob","URL","createObjectURL","msSaveBlob","DataURLUtils","dataURL","parts","binData","atob","decodeURIComponent","pop","uiArr","Uint8Array","charCodeAt","MozBlob","WebKitBlob","opts","DownloadUtils","downloadWithAnchor","anchor","startsWith","revokeObjectURL","downloadWithSafari","reader","FileReader","readAsDataURL","confirm","downloadWithIframe","iframe","RequestUtils","createRequest","xhr","XMLHttpRequest","withCredentials","setHeaders","headers","_slicedToArray","setRequestHeader","downloadFromURL","responseType","saveAs","response","statusText","ontimeout","beforeRequest","send","fileNameOrOptions","blob","actualMimeType","temp","extractedFileName","uint8Array","objectURL","btoa","encodeURIComponent","Download","dUrl","newUrl","getAbsoluteURL","saveAsOptions","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","MouseEvent","bubbles","view","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","f","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","_preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_p","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","payload","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","Range","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","enoughBuffer","buffers","curDecodedFrames","checkInterval","hidden","_this$_checkBuffer","_checkBuffer","reportFrame","stuckCount","_reset","_media$getVideoPlayba","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeSegments","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player","FullscreenIcon","CssFullscreenIcon","VolumeIcon"],"mappings":"m9UAGA,IAAAA,EAAe,iBCFTC,EAAoC,oBAAZC,QAA2BA,OAAOC,UAAYD,OAAOC,SAASC,KAAKC,QAAQ,uBAAwB,EAE3HC,EAAQ,CACZC,KAAM,6CACNC,MAAO,yCACPC,KAAM,8CAGFC,EAAQ,eAERC,EAAW,CACfC,OAAQ,CACNC,MAAOZ,EAAgB,EAAI,GAG7Ba,QAAS,SAAUC,GAA4B,IAAAC,IAAAA,EAAAC,EAAAC,UAAAC,OAAhBC,MAAcC,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAA,EAAAA,EAAAJ,GAAAA,UAAAI,GAC3CC,KAAKX,OAAOC,OAAS,IAAKG,EAAAQ,SAAQC,IAAGC,MAAAV,EAAA,CAACN,EAAOJ,EAAMC,KAAMQ,GAAOY,OAAKP,KAGvEQ,QAAS,SAAUb,GAA4B,IAAAc,IAAAA,EAAAC,EAAAZ,UAAAC,OAAhBC,MAAcC,MAAAS,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAb,GAAAA,UAAAa,GAC3CR,KAAKX,OAAOC,OAAS,IAAKgB,EAAAL,SAAQf,KAAIiB,MAAAG,EAAA,CAACnB,EAAOJ,EAAMG,KAAMM,GAAOY,OAAKP,KAGxEY,SAAU,SAAUjB,GAA4BkB,IAAAA,EAC1C,KAAAV,KAAKX,OAAOC,MAAQ,GAApB,CAGmD,IAAvD,IAAMqB,EAAOX,KAAKX,OAAOC,OAAS,EAAI,QAAU,QAAOsB,EAAAjB,UAAAC,OAJzBC,MAAcC,MAAAc,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAlB,GAAAA,UAAAkB,IAK5CH,EAAAT,SAAQU,GAAKR,MAAAO,EAAA,CAACvB,EAAOJ,EAAME,MAAOO,GAAOY,OAAKP,WC7B7BiB,EAAiB,WACpC,SAAAA,EAAaC,GAAcC,OAAAF,GACzBd,KAAKe,aAAeA,EAarBD,OAZAG,EAAAH,EAAA,CAAA,CAAAI,IAAA,QAAAC,MAED,SAAOC,GACE,OAAApB,KAAKe,aAAaK,GAAOC,QACjC,CAAAH,IAAA,MAAAC,MAED,SAAKC,GACI,OAAApB,KAAKe,aAAaK,GAAOE,MACjC,CAAAJ,IAAA,SAAAK,IAED,WACE,OAAOvB,KAAKe,aAAanB,WAC1BkB,EAfmC,GCEhCU,EAAO,GAqjBJC,SAAAA,EAAWP,EAAKQ,GACvB,IAAA,IAASC,EAAI,EAAGC,EAAMF,EAAK9B,OAAQ+B,EAAIC,EAAKD,IAC1C,GAAIT,EAAIpC,QAAQ4C,EAAKC,KAAU,EACtB,OAAA,EAGJ,OAAA,EA6XT,SAASE,EAAUV,GACXW,IAAAA,EAAIC,EAAUZ,GACpB,OAAiB,OAAVA,IAA4B,WAATW,GAA8B,aAATA,GAGxCE,SAAAA,EAAUC,EAAMC,EAAMC,GAC7B,IAAIC,EACFC,EACAC,EACAC,EACAC,EACAC,EAEEC,EAAiB,EACjBC,GAAU,EACVC,GAAS,EACTC,GAAW,EAGTC,GAAWZ,GAAiB,IAATA,GAAsD,mBAAjCvD,OAAOoE,sBAEjD,GAAgB,mBAATd,EACH,MAAA,IAAIe,UAAU,uBAUtB,SAASC,EAAYC,GACnB,IAAMC,EAAOf,EACPgB,EAAUf,EAKTE,OAHPH,EAAWC,OAAWgB,EACLH,EAAAA,EACRjB,EAAAA,EAAK9B,MAAMiD,EAASD,GAItBG,SAAAA,EAAYC,EAAarB,GAChC,OAAIY,GACFnE,OAAO6E,qBAAqBhB,GACrB7D,OAAOoE,sBAAsBQ,IAE/BE,WAAWF,EAAarB,GAUjC,SAASwB,EAAaR,GAMbP,OAJUO,EAAAA,EAEPI,EAAAA,EAAWK,EAAczB,GAE5BS,EAAUM,EAAWC,GAAQX,EAatC,SAASqB,EAAcV,GACrB,IAAMW,EAAoBX,EAAOT,EAMjC,YAAyBY,IAAjBZ,GAA+BoB,GAAqB3B,GACzD2B,EAAoB,GAAOjB,GANFM,EAAOR,GAM4BJ,EAGjE,SAASqB,IACDT,IAAAA,EAAOY,KAAKC,MACdH,GAAAA,EAAaV,GACf,OAAOc,EAAad,GAGtBV,EAAUc,EAAWK,EA3BvB,SAAwBT,GACtB,IACMe,EAAsBf,EAAOR,EAC7BwB,EAAchC,GAFMgB,EAAOT,GAIjC,OAAOG,EACHuB,KAAKC,IAAIF,EAAa5B,EAAU2B,GAChCC,EAoB+BG,CAAcnB,IAGnD,SAASc,EAAcd,GAKrB,OAJUG,OAAAA,EAINR,GAAYT,EACPa,EAAWC,IAEpBd,EAAWC,OAAWgB,EACfd,GAmBT,SAAS+B,IAE8B,IAD/BpB,IAAAA,EAAOY,KAAKC,MACZQ,EAAaX,EAAaV,GAAK3C,EAAAZ,UAAAC,OAFhBuD,EAAIrD,IAAAA,MAAAS,GAAAR,EAAA,EAAAA,EAAAQ,EAAAR,IAAJoD,EAAIpD,GAAAJ,UAAAI,GAQzB,GAJWoD,EAAAA,EACAd,EAAArC,KACIkD,EAAAA,EAEXqB,EAAY,CACd,QAAgBlB,IAAZb,EACF,OAAOkB,EAAYjB,GAErB,GAAIG,EAGF,OADUU,EAAAA,EAAWK,EAAczB,GAC5Be,EAAWR,GAMfF,YAHSc,IAAZb,IACQc,EAAAA,EAAWK,EAAczB,IAE9BK,EAKF+B,OA9HPpC,GAAQA,GAAQ,EACZL,EAASM,KACDQ,IAAER,EAAQQ,QAEVC,GADVA,EAAS,YAAaT,GACHgC,KAAKK,KAAKrC,EAAQG,SAAW,EAAGJ,GAAQI,EAC3DO,EAAW,aAAcV,IAAYA,EAAQU,SAAWA,GAsH1DyB,EAAUG,OAvCV,gBACkBpB,IAAZb,GA3DN,SAAsBkC,GACpB,GAAI5B,EACKnE,OAAAA,OAAO6E,qBAAqBkB,GAErCC,aAAaD,GAwDXE,CAAYpC,GAEGE,EAAA,EACND,EAAAA,EAAeJ,EAAWG,OAAUa,GAmCjDiB,EAAUO,MAhCV,WACE,YAAmBxB,IAAZb,EAAwBD,EAASyB,EAAaF,KAAKC,QAgC5DO,EAAUQ,QA7BV,WACE,YAAmBzB,IAAZb,GA6BF8B,EAGAS,SAAAA,EAAU9C,EAAMC,EAAMC,GAC7B,IAAIQ,GAAU,EACVE,GAAW,EAEX,GAAgB,mBAATZ,EACH,MAAA,IAAIe,UAAU,uBAMfhB,OAJHH,EAASM,KACXQ,EAAU,YAAaR,IAAYA,EAAQQ,QAAUA,EACrDE,EAAW,aAAcV,IAAYA,EAAQU,SAAWA,GAEnDb,EAASC,EAAMC,EAAM,CAC1BS,QAAAA,EACAE,SAAAA,EACAP,QAASJ,IArlCbV,EAAKwD,UAAY,WAAUC,IAAAA,EAAEtF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,MAAOuF,EAAGvF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIwF,EAAKxF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIyF,EAAKzF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC7D0F,EAAMC,SAASC,cAAcN,GAc5BI,OAbPA,EAAIG,UAAYJ,EAChBC,EAAII,UAAYP,EAChBQ,OAAOC,KAAKR,GAAOS,SAAQ,SAAAC,GACzB,IAAM3E,EAAM2E,EACN1E,EAAQgE,EAAMU,GACT,UAAPZ,GAAyB,UAAPA,GAAyB,eAAPA,EAClC9D,GACE2E,EAAAA,aAAa5E,EAAKC,GAGpB2E,EAAAA,aAAa5E,EAAKC,MAGnBkE,GAUJU,EAAAA,kBAAoB,SAAUC,GAAMb,IAAAA,EAAKxF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIsG,EAAStG,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC3D,IACEuG,IAAAA,EAAMZ,SAASC,cAAc,OACjCW,EAAIT,UAAYO,EAChB,IAAIX,EAAMa,EAAIC,SAEVd,OADEa,EAAA,KACFb,EAAIzF,OAAS,GACfyF,EAAMA,EAAI,GACG7D,GAAAA,EAAK4E,SAASf,EAAKY,GAC5Bd,GACFO,OAAOC,KAAKR,GAAOS,SAAQ,SAAA1E,GACrB4E,EAAAA,aAAa5E,EAAKiE,EAAMjE,OAGzBmE,GAEF,WACAgB,GAEA,OADE5F,EAAAA,SAAS,yBAA0B4F,GACrC,OAUNC,EAAAA,SAAW,SAAUrB,EAAIO,GACxB,IAACP,IAAOO,EACH,OAAA,EAEL,IACF,OAAO1F,MAAMyG,UAAUC,KAAKC,KAAKxB,EAAGyB,WAAW,SAAAb,GAAI,OAAIA,IAASL,WACzDmB,GACP,IAAMC,EAAe3B,EAAGO,WAAqC,WAAxBzD,EAAOkD,EAAGO,WAAyBP,EAAG4B,aAAa,SAAW5B,EAAGO,UAC/FoB,OAAAA,KAAkBA,EAAaE,MAAM,IAAIC,OAAO,UAAYvB,EAAY,cAU9EY,EAAAA,SAAW,SAAUnB,EAAIO,GACxB,GAACP,GAAOO,EAGR,IACQwB,EAAAA,QAAQ,eAAgB,IAAIC,MAAM,QAAQrB,SAAQ,SAAAC,GAClDZ,GAAAA,EAAGyB,UAAUQ,IAAIrB,YAEpBc,GACFnF,EAAK8E,SAASrB,EAAIO,KACjBP,EAAGO,WAAqC,WAAxBzD,EAAOkD,EAAGO,WAC5BP,EAAGa,aAAa,QAASb,EAAG4B,aAAa,SAAW,IAAMrB,GAE1DP,EAAGO,WAAa,IAAMA,KAYzB2B,EAAAA,YAAc,SAAUlC,EAAIO,GAC3B,GAACP,GAAOO,EAGR,IACQwB,EAAAA,QAAQ,eAAgB,IAAIC,MAAM,QAAQrB,SAAQ,SAAAC,GAClDZ,GAAAA,EAAGyB,UAAUU,OAAOvB,YAEvBc,GACHnF,EAAK8E,SAASrB,EAAIO,IACpBA,EAAUyB,MAAM,QAAQrB,SAAQ,SAAAC,GAC9B,IAAMwB,EAAM,IAAIN,OAAO,UAAYlB,EAAO,WACtCZ,EAAGO,WAAqC,WAAxBzD,EAAOkD,EAAGO,WACzBM,EAAAA,aAAa,QAASb,EAAG4B,aAAa,SAASG,QAAQK,EAAK,MAE/DpC,EAAGO,UAAYP,EAAGO,UAAUwB,QAAQK,EAAK,UAa9CC,EAAAA,YAAc,SAAUrC,EAAIO,GAC1BP,GAILO,EAAUyB,MAAM,QAAQrB,SAAQ,SAAAC,GAC1BrE,EAAK8E,SAASrB,EAAIY,GACfsB,EAAAA,YAAYlC,EAAIY,GAEhBO,EAAAA,SAASnB,EAAIY,OAWxBrE,EAAK+F,WAAa,WAEhB,IAF4B,IAAAC,EAAA7H,UACtBsG,EAAY,GAAEwB,EAAA,SAAA9F,GAEgB,WAA9BH,EAAKkG,OAAO/H,EAAUgC,IAEdgG,EAAAA,KAAKhI,EAAUgC,IACc,WAA9BH,EAAKkG,OAAO/H,EAAUgC,KAC/B+D,OAAOC,KAAKhG,EAAUgC,IAAIiG,KAAI,SAAA1G,GACxBvB,EAAUgC,GAAGT,IAEf+E,EAAU0B,KAAKzG,OARdS,EAAI,EAAGA,EAAIhC,UAAUC,OAAQ+B,IAAG8F,EAAA9F,GAgBlCsE,OAAAA,EAAU4B,KAAK,MASxBrG,EAAKsG,QAAU,WAAU7C,IACnBI,EADmBJ,EAAEtF,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG2F,SAAUyC,EAAGpI,UAAAC,OAAAD,EAAAA,kBAAA0D,EAIrC,IACI4B,EAAAA,EAAG+C,cAAcD,SAChBpB,GACElG,EAAAA,SAAS,eAAgBkG,GACT,IAArBoB,EAAIjJ,QAAQ,OACduG,EAAMJ,EAAGgD,eAAeF,EAAIG,MAAM,KAG/B7C,OAAAA,GASJ8C,EAAAA,OAAS,SAAU9C,EAAKnE,GACpBmE,OAAAA,EAAI+C,aAAe/C,EAAI+C,aAAalH,GAAOoE,SAAS+C,YAAYC,iBAAiBjD,GAAK,GAAOnE,IAGtGM,EAAK+G,SAAW,SAAUC,EAAK5I,EAAQ6I,GAMrC,IALMC,IAAAA,EAAUC,OAAOF,GACjB7G,EAAMhC,GAAU,EAClBgJ,EAASzE,KAAK0E,KAAKjH,EAAM8G,EAAQ9I,QAC/BkJ,EAAQ,GACRC,EAAIJ,OAAOH,GACVI,KACLE,EAAMnB,KAAKe,GAENI,OAAAA,EAAMjB,KAAK,IAAImB,UAAU,EAAGpH,EAAMmH,EAAEnJ,QAAUmJ,GAQlDE,EAAAA,OAAS,SAAU/F,GAClBvE,GAAAA,OAAOuK,MAAMhG,GACR,MAAA,GAEFiB,EAAAA,KAAKgF,MAAMjG,GACZkG,IAAAA,EAAO5H,EAAK+G,SAASpE,KAAKkF,MAAMnG,EAAO,MAAO,EAAG,GACjDoG,EAAS9H,EAAK+G,SAASpE,KAAKkF,OAAOnG,EAAc,KAAPkG,GAAe,IAAK,EAAG,GACjEG,EAAS/H,EAAK+G,SAASpE,KAAKkF,MAAOnG,EAAc,KAAPkG,EAAuB,GAATE,GAAe,EAAG,GAChF,OAAiB,OAATF,EAAgB,CAACE,EAAQC,GAAU,CAACH,EAAME,EAAQC,IAAS1B,KAAK,MAQrE2B,EAAAA,MAAQ,SAAU7C,GACrB,GAAIA,EAAE8C,QAAS,CACb,IAAMC,EAAQ/C,EAAE8C,QAAQ,IAAM9C,EAAEgD,eAAe,GAC7CC,EAAAA,QAAUF,EAAME,SAAW,EAC3BC,EAAAA,QAAUH,EAAMG,SAAW,EAC7BlD,EAAEmD,QAAUJ,EAAMK,MAAQL,EAAMM,OAAOC,WACvCtD,EAAEuD,QAAUR,EAAMS,MAAQT,EAAMM,OAAOI,UAEvCC,EAAAA,QAAU1D,EAAEqD,QAAUrD,EAAE2D,YAQvB5C,EAAAA,OAAS,SAAU6C,GAEf7E,OAAAA,OAAOa,UAAUiE,SAAS/D,KAAK8D,GAAKzD,MAAM,qBAAqB,IASnE2D,EAAAA,SAAW,SAAUC,EAAKC,GACzBnJ,GAAqB,WAArBA,EAAKkG,OAAOiD,IAA0C,WAArBnJ,EAAKkG,OAAOgD,GAexCA,OAdPhF,OAAOC,KAAKgF,GAAK/E,SAAQ,SAAA1E,GAEO,WAA1BM,EAAKkG,OAAOiD,EAAIzJ,KAAwByJ,EAAIzJ,aAAgB0J,KAM3B,UAA1BpJ,EAAKkG,OAAOiD,EAAIzJ,IACzBwJ,EAAIxJ,GAAiC,UAA1BM,EAAKkG,OAAOgD,EAAIxJ,IAAoBwJ,EAAIxJ,GAAKd,OAAOuK,EAAIzJ,IAAQyJ,EAAIzJ,GAE/EwJ,EAAIxJ,GAAOyJ,EAAIzJ,QAREmC,IAAbqH,EAAIxJ,SAAmCmC,IAAbqH,EAAIxJ,GAChCwJ,EAAIxJ,GAAOyJ,EAAIzJ,GAEfM,EAAKiJ,SAASC,EAAIxJ,GAAMyJ,EAAIzJ,OAQ3BwJ,GAUNG,EAAAA,UAAY,SAAUH,EAAKC,GAYvBD,OAXPhF,OAAOC,KAAKgF,GAAK/C,KAAI,SAAA1G,GAEsB4J,IAAAA,EADX,UAA1BtJ,EAAKkG,OAAOiD,EAAIzJ,KAA+C,UAA1BM,EAAKkG,OAAOgD,EAAIxJ,IACzB,UAA1BM,EAAKkG,OAAOgD,EAAIxJ,MAClB4J,EAAAJ,EAAIxJ,IAAKyG,KAAIxH,MAAA2K,EAAAC,EAAIJ,EAAIzJ,KAEdM,EAAKkG,OAAOgD,EAAIxJ,MAAUM,EAAKkG,OAAOiD,EAAIzJ,KAAsB,OAAbwJ,EAAIxJ,IAA2C,WAA1BM,EAAKkG,OAAOgD,EAAIxJ,KAAwByJ,EAAIzJ,aAAgBvC,OAAOiM,KAGvI,OAAbD,EAAIzJ,KAAkBwJ,EAAIxJ,GAAOyJ,EAAIzJ,IAFrCM,EAAKqJ,UAAUH,EAAIxJ,GAAMyJ,EAAIzJ,OAK1BwJ,GAGJM,EAAAA,WAAa,SAAU/F,GAE1B,IAAMgG,GAAOhG,EAAGmD,cAAgBzJ,OAAO2J,iBAAiBrD,EAAI,OAAOiG,gBAC/D,IAACD,GAAe,SAARA,EACH,MAAA,GAEHE,IAAAA,EAAI7F,SAASC,cAAc,KAEjC,OADA4F,EAAEtM,KAAOoM,EAAIjE,QAAQ,cAAe,IAC7BmE,EAAEtM,MAQNuM,EAAAA,QAAU,SAAU/F,GACnBA,GAAAA,GAAwB,IAAjBA,EAAIgG,SAAgB,CAC7B,IAAMC,EAAOhG,SAASC,cAAcF,EAAIkG,SAOjCD,OANPxL,MAAMyG,UAAUX,QAAQa,KAAKpB,EAAImG,YAAY,SAACC,GAC5CH,EAAKxF,aAAa2F,EAAKC,KAAMD,EAAKtK,UAEhCkE,EAAII,YACN6F,EAAK7F,UAAYJ,EAAII,WAEhB6F,EAEA,MAAA,IAWX9J,EAAKmK,YAAc,SAAUC,EAASC,EAAWC,EAAcC,GACxDH,EAAQI,UAAUH,KACbG,EAAAA,UAAUH,GAAalN,OAAOgN,YAAYG,EAAaG,KAAKL,GAAUG,KAU7EG,EAAAA,cAAgB,SAAUN,EAASC,GACxBD,cAAAA,EAAQI,UAAUH,IAChCD,EAAQI,UAAUH,GAAa,MAUjCrK,EAAKiC,WAAa,SAAUmI,EAASO,EAAKjJ,GACnC0I,EAAQQ,UACXR,EAAQQ,QAAU,IAEd1H,IAAAA,EAAKjB,YAAW,eAEfkB,EAAAA,aAAaiH,EAASlH,KAC1BxB,GAEIwB,OADC0H,EAAAA,QAAQzE,KAAKjD,GACdA,GAQJC,EAAAA,aAAe,SAAUiH,EAASlH,GACrC,IAAQ0H,EAAYR,EAAZQ,QACR,GAA6B,UAAzB5K,EAAKkG,OAAO0E,IACd,IAAA,IAASzK,EAAI,EAAGA,EAAIyK,EAAQxM,OAAQ+B,IAC9ByK,GAAAA,EAAQzK,KAAO+C,EAAI,CACb2H,EAAAA,OAAO1K,EAAG,GAClBgD,aAAaD,GACb,YAIJC,aAAaD,IAQZ4H,EAAAA,eAAiB,SAAUV,GAC9B,IAAQQ,EAAYR,EAAZQ,QACqB,UAAzB5K,EAAKkG,OAAO0E,KACNxE,EAAAA,KAAI,SAAA/B,GACVlB,aAAakB,MAEf+F,EAAQW,UAAY,KAYxB/K,EAAKgL,aAAe,SAAUd,EAAMe,EAAQC,EAAOC,GACjD,IAGMC,EAAGC,EAAGC,EAHNC,EAAMvL,EAAKwD,UAAS,MAAA5E,OAAOsL,GAAQ,GAAI,GAAE,YAAAtL,OAAcsL,YAC7DqB,EAAIC,MAAM9B,wBAAe9K,OAAWqM,EAAU,MAC1CC,GAASC,KAEX,CAAC,KAAM,MAAO,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAKM,OAAM,SAACpH,GACxD6G,QAAAA,EAAM5N,QAAQ+G,OAAc8G,EAAO7N,QAAQ+G,IAAY,KACrDqH,EAAAA,WAAWR,EAAMxE,MAAM,EAAGwE,EAAM5N,QAAQ+G,IAAOsH,QAC/CD,EAAAA,WAAWP,EAAOzE,MAAM,EAAGyE,EAAO7N,QAAQ+G,IAAOsH,QAC9CtH,EAAAA,GACA,MAKXkH,EAAIC,MAAMN,MAAKtM,GAAAA,OAAMwM,GAACxM,OAAG0M,GACzBC,EAAIC,MAAML,OAAMvM,GAAAA,OAAMyM,GAACzM,OAAG0M,GAC1BC,EAAIC,MAAMI,kBAAchN,OAAMwM,GAACxM,OAAG0M,EAAI,KAAA1M,OAAIyM,GAACzM,OAAG0M,GAE5CC,EAAIC,MAAMK,OADC,UAAT3B,EACc,IAAAtL,OAAOyM,EAAI,GAACzM,OAAG0M,EAAI,gBAAA1M,OAAewM,EAAI,GAACxM,OAAG0M,GAEvC,qBAGhBC,OAAAA,GASJO,EAAAA,SAAW,SAAUC,EAAKC,GAC7B,IAAMC,EAAM,GAER,GAAA,mBAAmBC,KAAKH,GAAM,CAChC,IAAII,EAAS,IACT3G,EAAAA,QAAQ,cAAc,SAAU4G,GAClCD,GAAUC,EAAKA,KAEXD,EAAAA,EAEJ,MAAA,kBAAkBD,KAAKH,IACrBvG,EAAAA,QAAQ,iBAAiB,SAAU4G,GACrCH,EAAI9F,KAAKkG,SAASD,EAAI,QAExBxN,QAAAA,OAAeqN,EAAI5F,KAAK,KAAI,MAAAzH,OAAKoN,EAAK,MAE/B,4BAQXhM,EAAKsM,gBAAkB,WACrB,OAAOxI,SAASyI,mBAAqBzI,SAAS0I,yBAA2B1I,SAAS2I,sBAAwB3I,SAAS4I,qBAOhHC,EAAAA,gBAAkB,SAAUhC,GACxBA,OAAAA,GAAsB,mBAARA,GAOlBiC,EAAAA,cAAgB,SAAU7D,GAC7B,OAAe,OAARA,GAA+B,WAAfxI,EAAOwI,IAM3B8D,EAAAA,KAAO,SAAUhJ,GACpBA,EAAI2H,MAAMsB,QAAU,QAOjBC,EAAAA,KAAO,SAAUlJ,EAAKiJ,GACrBtB,EAAAA,MAAMsB,QAAUA,GAAW,SAQ5BE,EAAAA,YAAc,SAAUC,GAC3B,GAAI,MAAOA,EACF,OAAA,GAINC,EAAAA,UAAY,SAAUD,GAClB,QAAA,MAAEA,IASNE,EAAAA,oBAAsB,SAAUtJ,EAAKuJ,GAEnCA,IAGqB,WAAtBpN,EAAKkG,OAAOkH,GACGA,EAAK5H,QAAQ,OAAQ,IAAIC,MAAM,KACvCW,KAAI,SAAA/B,GACX,GAAIA,EAAM,CACFgJ,IAAAA,EAAMhJ,EAAKoB,MAAM,KACnB4H,EAAIjP,OAAS,IACXoN,EAAAA,MAAM6B,EAAI,IAAMA,EAAI,QAK9BnJ,OAAOC,KAAKiJ,GAAMhH,KAAI,SAAA1G,GAChB8L,EAAAA,MAAM9L,GAAO0N,EAAK1N,QA0BvB4N,EAAAA,oBAAsB,SAAUzJ,GAAK3D,IAAAA,EAAI/B,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAA,GAAG,CAAC,QAAS,SAAU,MAAO,OAAQ,SAAU,QAAS,WAAY,UAAW,UAAW,SAAU,aAC3IoP,EAAW1J,EAAI2H,MAAMgC,QAC3B,IAAKD,EACH,MAAO,GAET,IAAME,EAAWF,EAAS/H,QAAQ,OAAQ,IAAIC,MAAM,KAC9CiI,EAAM,GACNC,EAAS,GAmBRD,OAlBEtH,EAAAA,KAAI,SAAA/B,GACX,GAAIA,EAAM,CACFgJ,IAAAA,EAAMhJ,EAAKoB,MAAM,KACnB4H,EAAIjP,OAAS,IACX6B,EAAUoN,EAAI,GAAInN,GAChBmN,EAAAA,EAAI,IAAMA,EAAI,GAGXA,EAAAA,EAAI,IAAMA,EAAI,QAKzB/I,EAAAA,aAAa,QAAS,IAC1BJ,OAAOC,KAAKwJ,GAAQvH,KAAI,SAAA1G,GAElB8L,EAAAA,MAAM9L,GAAOiO,EAAOjO,MAEnBgO,GAQJE,EAAAA,oBAAsB,SAAU/J,GAC7B0J,IAAAA,EAAW1J,EAAI2H,MAAMgC,QAC3B,IAAKD,EACH,MAAO,GAET,IAAME,EAAWF,EAAS/H,QAAQ,OAAQ,IAAIC,MAAM,KAC9CiI,EAAM,GASLA,OAREtH,EAAAA,KAAI,SAAA/B,GACX,GAAIA,EAAM,CACFgJ,IAAAA,EAAMhJ,EAAKoB,MAAM,KACnB4H,EAAIjP,OAAS,IACXiP,EAAAA,EAAI,IAAMA,EAAI,QAIjBK,GAGJG,EAAAA,WAAa,SAACpE,GAAKqE,IAAAA,EAAM3P,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,aAAU4P,EAAO5P,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,aACnD,GAAKsL,EAAL,CAGIuE,IAAAA,EAAM,IAAI7Q,OAAO8Q,MACjBH,EAAAA,OAAS,SAAC3I,GACN6I,EAAA,KACNF,GAAUA,EAAO3I,IAEf4I,EAAAA,QAAU,SAAC5I,GACP6I,EAAA,KACND,GAAWA,EAAQ5I,IAErB6I,EAAI7E,IAAMM,IAGPyE,EAAAA,gBAAkB,SAAC/I,GAClBA,GACFA,EAAE+I,mBAINlO,EAAKmO,UAAY,WACf,OAAOhR,OAAOiR,aACdtK,SAASuK,gBAAgBF,WACzBrK,SAASwK,KAAKH,WACd,GAGFnO,EAAKuO,WAAa,WAChB,OAAOpR,OAAOqR,aACd1K,SAASuK,gBAAgBE,YACzBzK,SAASwK,KAAKC,YACd,GAGFvO,EAAKyO,kBAAoB,WACvB,MAAO,iBAAkBtR,QAGtBuR,EAAAA,aAAe,SAACC,GAEnB,IAF8BC,IAAAA,EAAezQ,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC1C0Q,EAAW,GACR1O,EAAI,EAAGA,EAAIwO,EAAUvQ,OAAQ+B,IACpC0O,EAAS1I,KAAK,CAAEtG,MAAO8O,EAAU9O,MAAMM,GAAK,GAAM,EAAIwO,EAAU9O,MAAMM,GAAIL,IAAK6O,EAAU7O,IAAIK,KAEtF2O,EAAAA,MAAK,SAAUnF,EAAGoF,GACnBC,IAAAA,EAAOrF,EAAE9J,MAAQkP,EAAElP,MACzB,OAAImP,GAGKD,EAAEjP,IAAM6J,EAAE7J,OAGrB,IAAImP,EAAY,GAChB,GAAIL,EACF,IAAA,IAASzO,EAAI,EAAGA,EAAI0O,EAASzQ,OAAQ+B,IAAK,CACxC,IAAM+O,EAAUD,EAAU7Q,OAC1B,GAAI8Q,EAAS,CACLC,IAAAA,EAAUF,EAAUC,EAAU,GAAGpP,IAClC+O,EAAS1O,GAAGN,MAAQsP,EAAWP,EAC9BC,EAAS1O,GAAGL,IAAMqP,IACpBF,EAAUC,EAAU,GAAGpP,IAAM+O,EAAS1O,GAAGL,KAGjCqG,EAAAA,KAAK0I,EAAS1O,SAGhBgG,EAAAA,KAAK0I,EAAS1O,SAIhB0O,EAAAA,EAEP,OAAA,IAAIvP,EAAkB2P,IAU1BG,EAAAA,YAAc,SAAUjK,GAAGkK,IAAAA,EAAIlR,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAI9B,OAHHgH,EAAE8C,SAAW9C,EAAE8C,QAAQ7J,OAAS,IAClC+G,EAAIA,EAAE8C,QAAQ,IAET,CACLqH,EAAGnK,EAAEmK,EAAID,EACTE,EAAGpK,EAAEoK,EAAIF,EACTjH,QAASjD,EAAEiD,QAAUiH,EACrBhH,QAASlD,EAAEkD,QAAUgH,EACrB/G,QAASnD,EAAEmD,QAAU+G,EACrB3G,QAASvD,EAAEuD,QAAU2G,EACrB9G,MAAOpD,EAAEoD,MAAQ8G,EACjB1G,MAAOxD,EAAEwD,MAAQ0G,IAIhB9N,EAAAA,sBAAwB,SAAUiO,GAC/BrQ,IAAAA,EAAOhC,OAAOoE,uBAEpBpE,OAAOsS,6BAGNtS,OAAOuS,0BAGPvS,OAAOwS,wBAGPxS,OAAOyS,wBACR,GAAIzQ,EACF,OAAOA,EAAKqQ,IAIXK,EAAAA,eAAiB,SAAUpG,GAC9B,GAAyB,WAArBzJ,EAAKkG,OAAOuD,GACP,MAAA,GAEHqG,IAAAA,EAAUrG,EAAIhE,MAAM,KACtBsK,EAAS,GAINA,OAHHD,EAAQ1R,OAAS,GAAK0R,EAAQ,KAChCC,EAASD,EAAQ,IAEZC,GAGJ/N,EAAAA,qBAAuB,SAAUgO,GACpC,IAAM7Q,EAAOhC,OAAO6E,sBAAwB7E,OAAO8S,yBAA2B9S,OAAO+S,4BACrF/Q,GAAQA,EAAK6Q,IAQVG,EAAAA,MAAQ,SAAUC,GAIrB,OAHIA,EAAMC,QACRD,EAAQA,EAAMC,UAEXD,GAAWA,aAAiBE,oBAG1B,QAAQpE,KAAKkE,EAAMG,aAAe,QAAQrE,KAAKkE,EAAMjH,OAGzDqH,EAAAA,OAAS,SAAU/G,GACtB,MAAsB,iBAARA,GAAoB,QAAQyC,KAAKzC,IAOjDzJ,EAAKyQ,kBAAoB,WAAUC,IAAAA,EAAGvS,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EACnCwS,GAAI,IAAIrO,MAAOsO,UACf,IACFF,EAAMrE,SAASqE,SACRvL,GACDuL,EAAA,EAEHA,GAAAA,EACDvT,OAAO0T,aAAiD,mBAA3B1T,OAAO0T,YAAYtO,MAClDoO,GAAKtE,SAASlP,OAAO0T,YAAYtO,QAEnC,IAAMuO,EAAO,uCAAuCtL,QAAQ,SAAS,SAAUuL,GAC7E,IAAMxJ,GAAKoJ,EAAoB,GAAhBhO,KAAKqO,UAAiB,GAAK,EAE1C,OADIrO,EAAAA,KAAKkF,MAAM8I,EAAI,KACL,MAANI,EAAYxJ,EAAS,EAAJA,EAAU,GAAMyB,SAAS,OAE7C8H,OAAAA,GAGJG,EAAAA,YAAc,SAAU5G,GACvBrC,IAAAA,EAOGA,MANqB,mBAAjB7K,OAAO+T,MACRlJ,EAAA,IAAIkJ,MAAM7G,IAEVvG,EAAAA,SAASmN,YAAY,UACvBE,UAAU9G,GAAW,GAAM,GAE5BrC,GAWThI,EAAKoR,qBAAuB,SAAU1P,EAAM2P,EAAUC,GAChD,OAACD,GAAa3P,IAGdA,EAAO2P,GAAaC,GAAW5P,EAAO2P,GACjCA,EAHA3P,GAQN6P,EAAAA,kBAAoB,SAAUvN,EAAWwN,GAC5C,IAAM3N,EAAM7D,EAAKwD,UACf,SACA,GACA,CAAE,cAAc,GAChBQ,GAGKH,OADP2N,EAAKC,YAAY5N,GACVA,GAGT7D,EAAK0R,kBAAoB,WAAUC,IAAAA,EAAGxT,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEmR,EAAG,EAAGC,EAAG,EAAGqC,MAAO,EAAGC,OAAQ,GAAKC,EAAc3T,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACvF4T,EAAS,CACbH,MAAK,GAAAhT,OAAK+S,EAAIC,OAAS,GACvBI,aAASpT,OAAK+S,EAAIrC,GAAK,EAAC1Q,OAAAA,OAAM+S,EAAIpC,GAAK,EAAI,KAC3CsC,UAAMjT,OAAK+S,EAAIE,QAAU,EAAC,QAEtBI,EAAa/N,OAAOC,KAAK4N,GAaxBD,OAVI1N,EAAAA,SAAQ,SAAC1E,GACZmG,IAAAA,EAAM,IAAIN,OAAM,GAAA3G,OAAIc,EAAG,iBAAiB,KACxCwS,EAAE,GAAAtT,OAAMc,EAAG,KAAAd,OAAImT,EAAOrS,GAAO,KAC/BmG,EAAIqG,KAAK4F,IACXjM,EAAIsM,WAAY,EACCL,EAAAA,EAAetM,QAAQK,EAAKqM,IAE/BtT,GAAAA,GAAAA,OAAOsT,EAAK,QAGvBJ,GAQJM,EAAAA,WAAa,SAAUnF,GAC1B,OAAItK,KAAK0P,IAAIpF,IAAQ,EACN,IAANA,EAEFA,EAAM,KAGVqF,EAAAA,eAAiB,SAAU5Q,EAAM6Q,GACpC,IAAMrU,EAAOqU,EAASnU,OAClBoU,GAAS,EACb,GAAItU,EAAO,EACFsU,OAAAA,EAET,GAAI9Q,GAAQ6Q,EAAS,GAAGzS,KAAO5B,EAAO,EAC3BsU,EAAA,OACA9Q,GAAAA,EAAO6Q,EAASrU,EAAO,GAAG4B,IACnC0S,EAAStU,EAAO,OAEhB,IAAA,IAASiC,EAAI,EAAGA,EAAIjC,EAAMiC,IACpBuB,GAAAA,EAAO6Q,EAASpS,EAAI,GAAGL,KAAO4B,GAAQ6Q,EAASpS,GAAGL,IAAI,CAC/CK,EAAAA,EACT,MAICqS,OAAAA,GAEJC,EAAAA,qBAAuB,SAAUC,EAAaH,GAAU3S,IAAAA,EAAKzB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,IAAG,EAC/DqU,GAAS,EAMb,IAJW5S,EADPA,GAAS,GAAKA,EAAQ2S,EAASnU,OACxBwB,EAEAI,EAAKsS,eAAeI,EAAaH,IAE/B,EACJ,OAAA,EAET,IAAMrU,EAAOqU,EAASnU,OACtBuU,EAAsCJ,EAASC,GAAvC3S,EAAK8S,EAAL9S,MAAOC,EAAG6S,EAAH7S,IAAK8S,EAAKD,EAALC,MAAOC,EAAMF,EAANE,OAC3B,OAAIH,EAAc7S,EACT+S,EACEF,GAAe7S,GAAS6S,GAAe5S,EACzC4S,EAAcG,EACZH,EAAc5S,GAAO0S,GAAUtU,EAAO,EACxC4B,GAEF,GASJgT,EAAAA,uBAAyB,SAAUC,EAAYR,GAClD,IAAIC,GAAS,EACb,IAAKD,GAAYA,EAASnU,OAAS,EAC1B2U,OAAAA,EAET,IAAA,IAAS5S,EAAI,EAAGA,EAAIoS,EAASnU,OAAQ+B,IAC/B4S,GAAAA,GAAcR,EAASpS,GAAGkR,SAAU,CAC7BlR,EAAAA,EACT,MAGJ,IAAmB,IAAfqS,EAAe,CACT3S,IAAAA,EAAU0S,EAASC,GAAnB3S,MACJ2S,OAAAA,EAAS,EAAI,EACR3S,EAAQkT,EAERlT,GAASkT,EAAaR,EAASC,EAAS,GAAGnB,UAG/C0B,OAAAA,GA8KT/S,EAAKQ,SAAWA,EAChBR,EAAKuD,SAAWA,EC/lChB,IAAMyP,EAAiB,CACrB,EAAG,QACH,EAAG,QACH,EAAG,QACH,EAAG,QACH,EAAG,QACH,EAAG,SAGCC,EAAY,CAChB,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,KACH,EAAG,MA8DCC,EAAMzT,GAaV,SAAAyT,EAAaC,GAAQC,IAAAA,EAASjV,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEkV,UAAW,GAAIC,UAAW,EAAGC,aAAc,GAAIC,YAAa,GAAIC,IAAK,GAAIC,WAAY,MAAMlU,OAAA0T,GAC5H,IAAMS,EAAcR,GAAUA,EAAOS,KAAOT,EAAOS,KAAKD,YAAc,KACtE,GAAIR,EAAO9C,MAAO,CACVqD,IAAAA,EAAaN,EAAUM,WAAaN,EAAUM,WAAcP,EAAO9C,MAAM5S,OAAS,GAChF4T,EAAkD8B,EAAlD9B,SAAUqB,EAAwCS,EAAxCT,YAAamB,EAA2BV,EAA3BU,MAAO1K,EAAoBgK,EAApBhK,IAAKoH,EAAe4C,EAAf5C,WAC3CuD,EAAqCX,EAAO9C,MAApC0D,EAAUD,EAAVC,WAAYC,EAAYF,EAAZE,aAChBC,EAAQb,EAAUE,WAAaI,EAAWQ,KAC1CjB,EAAUgB,KACZA,EAAQhB,EAAUgB,IAEpB,IAAM1M,EAAI,CACR4M,cAAelX,EACfyV,YAAAA,EACArB,SAAAA,EACAwC,MAAAA,EACAE,WAAAA,EACAC,aAAAA,EACA7K,IAAKA,GAAOoH,EACZ8C,UAAWD,EAAUC,UACrBC,UAAWW,EACXjW,QAASoV,EAAUG,cAAgBG,EAAW1V,QAC9C0V,WAAAA,EACAF,YAAaJ,EAAUI,YAAcJ,EAAUI,YAAYY,MAAQ,GACnEC,KAAMC,EAAKzE,eAAe1G,GAAOoH,IAK5BhJ,OAHGkM,EAAAA,KAAOvP,OAAOC,KAAKiP,EAAUK,KAAKrN,KAAI,SAAA1G,GAC5CA,EAAAA,GAAO0T,EAAUK,IAAI/T,MAElB6H,EAEHpJ,GAAAA,UAAUC,OAAS,EAAG,CAMxB,IALA,IAAMmJ,EAAI,CACR4M,cAAelX,EACf8S,OAAQjM,SAASiM,QAEb1C,EAAM,CAAC,YAAa,cAAe,WAAY,eAAgB,aAAc,MAAO,aAAc,QAAS,OAAQ,YAAa,cAC7HlN,EAAI,EAAGA,EAAIhC,UAAUC,OAAQ+B,IAClCkN,EAAAA,EAAIlN,IAAMhC,UAAUgC,GAGjBoH,OADPA,EAAEgN,GAAKZ,GAAeA,EAAYxV,UAAU,KAAO,IAAIqW,IAAM,GACtDjN,MCzIFkN,EAAO,OACPC,EAAU,UACVC,EAAQ,QACRC,EAAQ,QACRC,EAAQ,QACRC,EAAU,UACVC,EAAS,SACTC,EAAc,aACdC,EAAU,UACVC,EAAU,UAEVC,EAAkB,iBAClBC,EAAgB,eAChBC,EAAc,aAEdC,EAAc,aACdC,EAAW,WACXC,EAAa,YACbC,EAAU,UAOVC,EAAe,QACfC,EAAc,OACdC,EAAQ,QACRC,GAAW,UACXC,GAAmB,mBACnBC,GAAqB,yBACrBC,GAAW,WACXC,GAAS,SACTC,GAAU,UACVC,GAAa,YACbC,GAAwB,wBACxBC,GAAe,cACfC,GAAe,cACfC,GAAU,UAGVC,GAAoB,oBACpBC,GAAwB,uBACxBC,GAAoB,oBAEpBC,GAAoB,oBAEpBC,GAA0B,0BAQ1BC,GAAe,eAGfC,GAAa,aAGbC,GAAS,SAGTC,GAAc,aAGdC,GAAW,WAEXC,GAAW,WAEXC,GAAQ,QAERC,GAAc,cAEdC,GAAQ,QAERC,GAAe,eAEfC,GAAiB,iBAIjBC,GAAe,CAC1B,OACA,UACA,QACA,QACA,QACA,UACA,SACA,aACA,UACA,UACA,iBACA,iBACA,eACA,aACA,iBACA,aACA,WACA,YACA,UACA,UACA,UACA,QACA,aAGWC,GAAe,CAC1BC,WAAY,aACZC,eAAgB,iBAChBC,YAAa,eAGFC,GAAY,iLAzGM,iFAIA,yEAKR,kBACA,gBACF,sBAGQ,gVAsBW,iEAId,mBAEL,0KA6BU,mIC/E/B,IAAIC,EAAM5T,OAAOa,UAAUgT,eACvBC,EAAS,IASb,SAASC,KA4BAC,SAAAA,EAAGhG,EAAI9H,EAAS+N,GACvB3Z,KAAK0T,GAAKA,EACV1T,KAAK4L,QAAUA,EACf5L,KAAK2Z,KAAOA,IAAQ,EActB,SAASC,EAAYC,EAASrQ,EAAOkK,EAAI9H,EAAS+N,GAC5C,GAAc,mBAAPjG,EACH,MAAA,IAAI1Q,UAAU,mCAGlB8W,IAAAA,EAAW,IAAIJ,EAAGhG,EAAI9H,GAAWiO,EAASF,GAC1CI,EAAMP,EAASA,EAAShQ,EAAQA,EAM7BqQ,OAJFA,EAAQG,QAAQD,GACXF,EAAQG,QAAQD,GAAKrG,GAC1BmG,EAAQG,QAAQD,GAAO,CAACF,EAAQG,QAAQD,GAAMD,GADRE,EAAAA,QAAQD,GAAKpS,KAAKmS,IAD1BE,EAAAA,QAAQD,GAAOD,EAAUD,EAAQI,gBAI7DJ,EAUAK,SAAAA,EAAWL,EAASE,GACI,KAAzBF,EAAQI,aAA4BD,EAAAA,QAAU,IAAIP,SAC5CI,EAAQG,QAAQD,GAU9B,SAASI,IACFH,KAAAA,QAAU,IAAIP,EACnBzZ,KAAKia,aAAe,EAxElBvU,OAAO0U,SACTX,EAAOlT,UAAmB6T,OAAAA,OAAO,OAM5B,IAAIX,GAASY,YAAoBb,GAAA,IA2ExCW,EAAa5T,UAAU+T,WAAa,WAC9BC,IACAC,EACA9O,EAFA6O,EAAQ,GAIZ,GAA0B,IAAtBva,KAAKia,aAA2BM,OAAAA,EAE/B7O,IAAAA,KAAS8O,EAASxa,KAAKga,QACtBV,EAAI7S,KAAK+T,EAAQ9O,IAAO6O,EAAM5S,KAAK6R,EAAS9N,EAAKxD,MAAM,GAAKwD,GAGlE,OAAIhG,OAAO+U,sBACFF,EAAMna,OAAOsF,OAAO+U,sBAAsBD,IAG5CD,GAUTJ,EAAa5T,UAAUmU,UAAY,SAAmBlR,GACpD,IAAIuQ,EAAMP,EAASA,EAAShQ,EAAQA,EAChCmR,EAAW3a,KAAKga,QAAQD,GAE5B,IAAKY,EAAU,MAAO,GACtB,GAAIA,EAASjH,GAAW,MAAA,CAACiH,EAASjH,IAElC,IAAA,IAAS/R,EAAI,EAAGiZ,EAAID,EAAS/a,OAAQib,EAAK,IAAI/a,MAAM8a,GAAIjZ,EAAIiZ,EAAGjZ,IAC1DA,EAAAA,GAAKgZ,EAAShZ,GAAG+R,GAGfmH,OAAAA,GAUTV,EAAa5T,UAAUuU,cAAgB,SAAuBtR,GAC5D,IAAIuQ,EAAMP,EAASA,EAAShQ,EAAQA,EAChCkR,EAAY1a,KAAKga,QAAQD,GAE7B,OAAKW,EACDA,EAAUhH,GAAW,EAClBgH,EAAU9a,OAFM,GAYzBua,EAAa5T,UAAUwU,KAAO,SAAcvR,EAAOwR,EAAIC,EAAIC,EAAIC,EAAIC,GAC7DrB,IAAAA,EAAMP,EAASA,EAAShQ,EAAQA,EAEhC,IAACxJ,KAAKga,QAAQD,GAAa,OAAA,EAE/B,IAEI5W,EACAxB,EAHA+Y,EAAY1a,KAAKga,QAAQD,GACzBnY,EAAMjC,UAAUC,OAIpB,GAAI8a,EAAUhH,GAAI,CAGR9R,OAFJ8Y,EAAUf,MAAM3Z,KAAKqb,eAAe7R,EAAOkR,EAAUhH,QAAIrQ,GAAW,GAEhEzB,GACD,KAAA,EAAG,OAAO8Y,EAAUhH,GAAGjN,KAAKiU,EAAU9O,UAAU,EAChD,KAAA,EAAG,OAAO8O,EAAUhH,GAAGjN,KAAKiU,EAAU9O,QAASoP,IAAK,EACpD,KAAA,EAAG,OAAON,EAAUhH,GAAGjN,KAAKiU,EAAU9O,QAASoP,EAAIC,IAAK,EACxD,KAAA,EAAUP,OAAAA,EAAUhH,GAAGjN,KAAKiU,EAAU9O,QAASoP,EAAIC,EAAIC,IAAK,EAC5D,KAAA,EAAUR,OAAAA,EAAUhH,GAAGjN,KAAKiU,EAAU9O,QAASoP,EAAIC,EAAIC,EAAIC,IAAK,EAChE,KAAA,EAAUT,OAAAA,EAAUhH,GAAGjN,KAAKiU,EAAU9O,QAASoP,EAAIC,EAAIC,EAAIC,EAAIC,IAAK,EAGtEzZ,IAAAA,EAAI,EAAGwB,EAAO,IAAIrD,MAAM8B,EAAK,GAAID,EAAIC,EAAKD,IACxCA,EAAAA,EAAI,GAAKhC,UAAUgC,GAG1B+Y,EAAUhH,GAAGvT,MAAMua,EAAU9O,QAASzI,OACjC,CACDvD,IACA0b,EADA1b,EAAS8a,EAAU9a,OAGvB,IAAK+B,EAAI,EAAGA,EAAI/B,EAAQ+B,IAGdC,OAFJ8Y,EAAU/Y,GAAGgY,MAAM3Z,KAAKqb,eAAe7R,EAAOkR,EAAU/Y,GAAG+R,QAAIrQ,GAAW,GAEtEzB,GACD,KAAA,EAAG8Y,EAAU/Y,GAAG+R,GAAGjN,KAAKiU,EAAU/Y,GAAGiK,SAAU,MAC/C,KAAA,EAAG8O,EAAU/Y,GAAG+R,GAAGjN,KAAKiU,EAAU/Y,GAAGiK,QAASoP,GAAK,MACnD,KAAA,EAAGN,EAAU/Y,GAAG+R,GAAGjN,KAAKiU,EAAU/Y,GAAGiK,QAASoP,EAAIC,GAAK,MACvD,KAAA,EAAatZ,EAAAA,GAAG+R,GAAGjN,KAAKiU,EAAU/Y,GAAGiK,QAASoP,EAAIC,EAAIC,GAAK,MAAA,QAE9D,IAAK/X,EAAWmY,IAAAA,EAAI,EAAGnY,EAAO,IAAIrD,MAAM8B,EAAK,GAAI0Z,EAAI1Z,EAAK0Z,IACnDA,EAAAA,EAAI,GAAK3b,UAAU2b,GAG1BZ,EAAU/Y,GAAG+R,GAAGvT,MAAMua,EAAU/Y,GAAGiK,QAASzI,IAK7C,OAAA,GAYTgX,EAAa5T,UAAUgV,GAAK,SAAY/R,EAAOkK,EAAI9H,GACjD,OAAOgO,EAAY5Z,KAAMwJ,EAAOkK,EAAI9H,GAAS,IAY/CuO,EAAa5T,UAAUoT,KAAO,SAAcnQ,EAAOkK,EAAI9H,GACrD,OAAOgO,EAAY5Z,KAAMwJ,EAAOkK,EAAI9H,GAAS,IAa/CuO,EAAa5T,UAAU8U,eAAiB,SAAwB7R,EAAOkK,EAAI9H,EAAS+N,GAC9EI,IAAAA,EAAMP,EAASA,EAAShQ,EAAQA,EAEhC,IAACxJ,KAAKga,QAAQD,GAAa,OAAA/Z,KAC/B,IAAK0T,EAEI,OADPwG,EAAWla,KAAM+Z,GACV/Z,KAGL0a,IAAAA,EAAY1a,KAAKga,QAAQD,GAE7B,GAAIW,EAAUhH,GAEVgH,EAAUhH,KAAOA,GACfiG,IAAQe,EAAUf,MAClB/N,GAAW8O,EAAU9O,UAAYA,GAEnCsO,EAAWla,KAAM+Z,OAEd,CACIpY,IAAAA,IAAAA,EAAI,EAAG6Y,EAAS,GAAI5a,EAAS8a,EAAU9a,OAAQ+B,EAAI/B,EAAQ+B,KAEhE+Y,EAAU/Y,GAAG+R,KAAOA,GACnBiG,IAASe,EAAU/Y,GAAGgY,MACtB/N,GAAW8O,EAAU/Y,GAAGiK,UAAYA,IAE9BjE,EAAAA,KAAK+S,EAAU/Y,IAOtB6Y,EAAO5a,OAAQI,KAAKga,QAAQD,GAAyB,IAAlBS,EAAO5a,OAAe4a,EAAO,GAAKA,EACpEN,EAAWla,KAAM+Z,GAGjB,OAAA/Z,MAUTma,EAAa5T,UAAUiV,mBAAqB,SAA4BhS,GAClEuQ,IAAAA,EAUG,OARHvQ,GACIgQ,EAAAA,EAASA,EAAShQ,EAAQA,EAC5BxJ,KAAKga,QAAQD,IAAMG,EAAWla,KAAM+Z,KAEnCC,KAAAA,QAAU,IAAIP,EACnBzZ,KAAKia,aAAe,GAGfja,MAMTma,EAAa5T,UAAUkV,IAAMtB,EAAa5T,UAAU8U,eACpDlB,EAAa5T,UAAUqT,YAAcO,EAAa5T,UAAUgV,GAK5DpB,EAAauB,SAAWlC,EAKxBW,EAAaA,aAAeA,EAM1BwB,EAAAC,QAAiBzB,yBC/Tb0B,GAAQ,GAEVC,GAAW,KAIFC,YAAWC,GAAAC,EAAAF,EAAAC,GAAAE,IAAAA,EAAAC,EAAAJ,GAAA,SAAAA,IAAAG,OAAAlb,OAAA+a,GAAAG,EAAA/b,MAAAH,KAAAL,WAIrBoc,OAJqB9a,EAAA8a,EAAA,CAAA,CAAA7a,IAAA,MAAAC,MAMtB,SAAKwT,GACEA,IAGLkH,GAAMlH,EAAOyH,UAAYzH,EAGS,IAA9BjP,OAAOC,KAAKkW,IAAOjc,QAChByc,KAAAA,UAAU1H,EAAOyH,UAAU,MAEnC,CAAAlb,IAAA,SAAAC,MAED,SAAQwT,GACDA,IAGuB2H,EAAAA,oBAErBT,GAAMlH,EAAOyH,aAWtB,CAAAlb,IAAA,WAAAC,MAKA,SAAUuS,GAAI6I,IAAAA,EAAQ5c,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GACpB,IAAA,IAAWuB,KAAO2a,GAChB,GAAInW,OAAOa,UAAUgT,eAAe9S,KAAKoV,GAAO3a,GAAM,CACpD,IAAMyT,EAASkH,GAAM3a,GAErB,GAAIqb,GACE7I,GAAAA,EAAGiB,GACL,WAGFjB,EAAGiB,MAMX,CAAAzT,IAAA,UAAAC,MAGA,SAASuS,GACP1T,KAAKwc,SAAS9I,KAGhB,CAAAxS,IAAA,OAAAC,MAKA,SAAMuS,GACJ,IAAInR,EAAS,KAUNA,OARFia,KAAAA,UAAS,SAAC7H,GACP8H,IAAAA,EAAO/I,EAAGiB,GAIT8H,OAHHA,IACO9H,EAAAA,GAEJ8H,KACN,GAEIla,IAGT,CAAArB,IAAA,UAAAC,MAIA,SAASuS,GACP,IAAMpC,EAAU,GAQTA,OANFkL,KAAAA,UAAS,SAAC7H,GACTjB,EAAGiB,IACLrD,EAAQ3J,KAAKgN,MAIVrD,IAGT,CAAApQ,IAAA,YAAAC,MAMA,SAAWib,GAAUM,IAAAA,IAAQ/c,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GACvB,GAACkc,GAAMO,GAeJA,OAZHM,EACG9W,KAAAA,SAAQ,SAAA+W,GACPP,IAAaO,EAAKP,UACpBO,EAAKL,cAAe,EACpBK,EAAKC,YAAa,GAElBD,EAAKL,cAAe,KAIxBT,GAAMO,GAAUE,aAAeI,EAE1BN,IAGT,CAAAlb,IAAA,cAAAC,MAIA,WAEE,IADMwE,IAAAA,EAAOD,OAAOC,KAAKkW,IAChBla,EAAI,EAAGA,EAAIgE,EAAK/F,OAAQ+B,IAAK,CAC9B4Q,IAAAA,EAAIsJ,GAAMlW,EAAKhE,IACjB4Q,GAAAA,GAAKA,EAAE+J,aACT,OAAO3W,EAAKhE,GAGT,OAAA,OAGT,CAAAT,IAAA,UAAAC,MAMA,SAASib,GAAUS,IAAAA,IAAMld,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GACnB,GAACkc,GAAMO,GAgBJA,OAbHS,EACGjX,KAAAA,SAAQ,SAAA+W,GACPP,IAAaO,EAAKP,UACpBO,EAAKL,cAAe,EACpBK,EAAKC,YAAa,GAElBD,EAAKC,YAAa,KAItBf,GAAMO,GAAUQ,WAAaC,EAGxBT,KACR,CAAA,CAAAlb,IAAA,cAAAC,MAjKD,WAES2a,OADPA,KAAAA,GAAa,IAAIC,GACVD,OACRC,GAJ8B5B,GAAYyB,QAAAzB,cCrB9B,ICmBT2C,GAAa,CACjBC,KAAM,GACNC,SAAU,GACVC,SAAU,IAGHpS,SAAAA,GAAWH,EAAKC,GAkBhBD,OAjBPhF,OAAOC,KAAKgF,GAAK/E,SAAQ,SAAA1E,GACvB,IAEoB4J,EAFdoS,EAAKpH,EAAKpO,OAAOiD,EAAIzJ,IACrBic,EAAKrH,EAAKpO,OAAOgD,EAAIxJ,IAChB,UAAPgc,GACS,UAAPC,IACFzS,EAAIxJ,GAAO,KAEb4J,EAAAJ,EAAIxJ,IAAKyG,KAAIxH,MAAA2K,EAAAC,EAAIJ,EAAIzJ,MACL,WAAPgc,GACE,WAAPC,IACFzS,EAAIxJ,GAAO,IAEHwJ,GAAAA,EAAIxJ,GAAMyJ,EAAIzJ,KAExBwJ,EAAIxJ,GAAOyJ,EAAIzJ,MAGZwJ,EAGT,SAAS0S,KACP1X,OAAOC,KAAKmX,GAAWC,KAAKM,IAAIzV,KAAI,SAAA1G,GAClC4b,GAAWG,SAAS/b,GAAOA,KA6CtBoc,SAAAA,GAAKC,EAAUC,GACtB,IAAIC,EAASF,EAASG,KAIlB,GAHCF,IACSV,EAAAA,IAETU,EAAUT,KAAX,CAGEY,IAAAA,EAAQJ,EAASK,MAAQ,GAChB,OAAXH,IACOA,EAAA,SAEND,EAAUT,KAAKU,GAIRD,GAAAA,EAAUT,KAAKU,GAASE,IAHxBX,EAAAA,SAASrV,KAAK8V,GACxBD,EAAUT,KAAKU,GAAUE,SAwB7BL,GDnIe,CACbI,KAAM,KACNE,KAAM,CACJzI,YAAa,CACX0I,QAAS,CACPnI,KAAM,EACNM,IAAK,wBAEP8H,IAAK,CACHpI,KAAM,EACNM,IAAK,uBAEP+H,MAAO,CACLrI,KAAM,EACNM,IAAK,iBAEP/M,OAAQ,CACNyM,KAAM,EACNM,IAAK,gBAEPgI,QAAS,CACPtI,KAAM,EACNM,IAAK,kBAEPiI,QAAS,CACPvI,KAAM,EACNM,IAAK,sBAEPkI,QAAS,CACPxI,KAAM,EACNM,IAAK,gBAEPmI,MAAO,CACLzI,KAAM,EACNM,IAAK,iBAGToI,aAAc,0DACdC,cAAe,iCACfC,kBAAmB,qHACnBC,iBAAkB,sDAClBC,iBAAkB,oDAClBC,cAAe,uCACfC,aAAc,oFACdC,gBAAiB,sCACjBC,kBAAmB,kCACnBC,kBAAmB,2CACnBC,kBAAmB,sCACnBC,iBAAkB,mCAClBC,4BAA6B,+BAC7BvH,OAAQ,SACRpB,MAAO,qBACP4I,UAAW,OACXC,WAAY,QACZC,cAAe,YACfC,cAAe,WACfC,YAAa,SACbC,YAAa,SACbC,gBAAiB,aACjBC,oBAAqB,kBACrBC,mBAAoB,gBACpBC,uBAAwB,qBACxBC,UAAW,UACXC,cAAe,MACfC,IAAK,MACLC,WAAY,aACZC,KAAM,OACNC,IAAK,MACLC,KAAM,OACNC,UAAW,yBACXC,WAAY,aACZC,aAAc,aACdC,QAAS,UACTC,QAAS,UACTC,SAAU,UC2Dd,IAAMC,GAAO,CACPvD,eACF,OAAOH,GAAWG,UAMhBD,eACF,OAAOF,GAAWE,UAShBD,WACF,IAAM7N,EAAM,GAOLA,OANI8N,GAAAA,SAASpV,KAAI,SAAA1G,GAClBA,EAAAA,GAAO4b,GAAWC,KAAK7b,MAEzB4b,GAAWC,KAAK,WAClB7N,EAAIuR,GAAK3D,GAAWC,KAAK,UAAY,IAEhC7N,GAOTwR,OA9GOA,SAAQC,EAAcnD,GAC7B,IAAIvI,EAAM,GAIN,GAHCuI,IACSV,EAAAA,IAETU,EAAUT,KAAX,CAIF9H,EADgC,UAA9Ba,EAAKpO,OAAOiZ,GACRjb,OAAOC,KAAKgb,GAAc/Y,KAAI,SAAAmV,GAE3B,MAAA,CACLW,KAFuB,OAATX,EAAgB,QAAUA,EAGxCa,KAAM+C,EAAa5D,OAIjB4D,EAERC,IAAQ7D,EAASS,EAATT,KACJnV,EAAAA,KAAI,SAAA/B,GACY,OAAdA,EAAK6X,OACP7X,EAAK6X,KAAO,SAETX,EAAKlX,EAAK6X,MAGHX,GAAAA,EAAKlX,EAAK6X,OAAS,GAAI7X,EAAK+X,MAAQ,IAF9CN,GAAIzX,EAAM2X,aA2FdF,IAAAA,GAMAuD,KA5DF,SAAenc,GAAIoc,IAAAA,EACX5R,EAAM,CACV6N,KAAM,GACNC,SAAU,GACVC,SAAU,GACV8D,IAAKrc,GAKAwK,OAHGA,GAAAA,EAAI6N,KAAMD,GAAWC,OAC/B+D,EAAA5R,EAAI8N,UAASrV,KAAIxH,MAAA2gB,EAAA/V,EAAI+R,GAAWE,WACtB9N,GAAAA,EAAI+N,SAAUH,GAAWG,UAC5B/N,IClGH8R,GACK,sBADLA,GAEK,oCAFLA,GAGC,sBAGDC,GAAiB,CACrB,yBACA,yBACA,yBACA,yBACA,cACA,YACA,uBACA,0BAMIC,GAAU,CACVC,aAEKpY,OADGmY,GAAQE,GACTC,KAAO,KAAO,UAGrBC,cACE,GAAqB,oBAAdC,UACF,MAAA,GAEHC,IAAAA,EAAKD,UAAUE,UAAUC,cACzBra,EAAM,CACVsa,GAAI,2BACJC,QAAS,oBACTC,OAAQ,mBACRC,MAAO,iBACPC,OAAQ,6BAEH,MAAA,GAAG3hB,OAAOsF,OAAOC,KAAK0B,GAAK2a,QAAO,SAAA9gB,GAAOmG,OAAAA,EAAInG,GAAKwM,KAAK8T,OAAM,IAAM,IAExEJ,SACE,GAAqB,oBAAdG,UACT,MAAO,GAET,IAAMC,EAAKD,UAAUE,UACfQ,EAAiB,oBAAoBvU,KAAK8T,GAC1CU,EAAY,gBAAgBxU,KAAK8T,IAAOS,EACxCE,EAAU,cAAczU,KAAK8T,GAC7BY,EAAU,cAAc1U,KAAK8T,GAC7Ba,EAAc,6BAA6B3U,KAAK8T,GAChDc,EAAY,cAAc5U,KAAK8T,GAC/Be,EAAY,cAAc7U,KAAK8T,GAC/BgB,EAAS,oBAAoB9U,KAAK8T,IAA+B,aAAvBD,UAAUkB,UAA2BlB,UAAUmB,eAAiB,EAC1GC,EACJH,GACCF,IAAc,aAAa5U,KAAK8T,KAC/Ba,GAAeE,IAAc,aAAa7U,KAAK8T,GAC7CoB,EAAU,YAAYlV,KAAK8T,KAAwCmB,EAElE,MAAA,CACLA,SAAAA,EACAC,QAAAA,EACAJ,OAAAA,EACAK,MAAOD,GAAWJ,EAClBF,UAAAA,EACAjB,OAPYuB,GAAYN,GAAcJ,GAAcS,GAQpDT,UAAAA,EACAD,eAAAA,EACAM,UAAAA,EACAF,YAAAA,EACAF,QAAAA,EACAC,QAAAA,IAIAU,gBACE,GAAqB,oBAAdvB,UACF,OAAA,EAET,IAAMC,EAAKD,UAAUE,UACjBpa,EAAM,GAWJ0b,GARJ1b,EAFE,+BAA+BqG,KAAK8T,GAEhCR,GACG,6BAA6BtT,KAAK8T,GAErCR,GAGAA,IAEa3Z,EAAI2b,KAAKxB,GAAM,GAChCuB,GAAAA,GAAUA,EAAOnjB,QAAU,EAAG,CAChC,IAAMnB,EAAUskB,EAAO,GAAG9b,MAAM,KAChC,OAAOxI,EAAQmB,OAAS,EAAIiO,SAASpP,EAAQ,IAAM,EAE9C,OAAA,GAGLwkB,eACE,GAAqB,oBAAd1B,UACF,OAAA,EAIT,QAFY,6BACMyB,KAAKzB,UAAUE,UAAUyB,sBAc7CC,aAAY,WACV,IAAM5gB,EAAS,CACb6gB,WAAW,EACXC,KAAM,IAEJ,GAAoB,oBAAb/d,SACF/C,OAAAA,EAET,GAAIvC,KAAKsjB,cACP,OAAOtjB,KAAKsjB,cAEVnY,IAAAA,EAAI7F,SAASC,cAAc,SAWxBhD,MAVsB,mBAAlB4I,EAAEoY,aACI3b,GAAAA,KAAI,SAAC1G,GACkC,aAAhDiK,EAAEoY,YAAWnjB,sBAAAA,OAAuBc,EAAM,QAC5CqB,EAAO6gB,WAAY,EACZC,EAAAA,MAAI,KAAAjjB,OAASc,OAI1BlB,KAAKsjB,cAAgB/gB,EACjB4I,EAAA,KACG5I,GAQTihB,aAAY,WAAEH,IAAAA,EAAI1jB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,4CACf,GAAuB,oBAAhB8jB,cAAgCA,YAAoB,OAAA,EAC3D,IACKA,OAAAA,YAAYC,gBAAgBL,SAC5BpkB,GAEA,OADF0kB,KAAAA,QAAQ1kB,MAAMokB,EAAMpkB,IAClB,IAQX2kB,gBAAe,WACb,QAA2B,oBAAhBH,cAAgCA,YAAYC,mBAIrDD,YAAYC,gBAAgB,wCAC5BD,YAAYC,gBAAgB,wCAC5BD,YAAYC,gBAAgB,wCAC5BD,YAAYC,gBAAgB,0CAQhCG,qBAAoB,SAAE7kB,GACpB,IAAM8kB,EAAW,CACfC,WAAW,EACXC,QAAQ,EACRC,gBAAgB,GAElB,IAAKjlB,GAA6B,oBAAduiB,UACX2C,OAAAA,QAAQC,QAAQL,GAEzB,GACEvC,UAAU6C,mBACV7C,UAAU6C,kBAAkBC,aAErB9C,OAAAA,UAAU6C,kBAAkBC,aAAarlB,GAE1CslB,IAAAA,EAActlB,EAAK4S,OAAS,GAC5B2S,EAAcvlB,EAAKwlB,OAAS,GAC9B,IACF,IAAMC,EAAiBhB,YAAYC,gBACjCY,EAAYI,aAERC,EAAiBlB,YAAYC,gBACjCa,EAAYG,aAGd,OAAOR,QAAQC,QAAQ,CACrBJ,UAAWU,GAAkBE,EAC7BX,QAAQ,EACRC,gBAAgB,UAEXtd,GACAud,OAAAA,QAAQC,QAAQL,MC/MtBc,SAAAA,GAAgBC,EAAUle,GAC5B3G,MAASA,KAAK+a,OAGF,UAAb8J,EACGC,KAAAA,aAAaD,EAAUle,EAAE1H,OAEzB8b,KAAAA,KAAK8J,EAAUle,IAKfoe,SAAAA,GAAsBF,EAAUlQ,GAChC,OAAA,SAAChO,EAAGqe,GACT,IAAMC,EAAQ,CACZtQ,OAAAA,EACA9I,UAAWgZ,EACXK,cAAeve,EACfwe,OAAQxe,EAAEwe,QAAU,GACpBC,UAAWze,EAAEye,UACblR,YAAaS,EAAOT,YACpBrB,SAAU8B,EAAO9B,SACjBwS,OAAQ1Q,EAAO0Q,OACfhQ,MAAOV,EAAOU,MACdiQ,eAAgB3Q,EAAO4Q,YAAY5e,EAAE7E,MACrC0jB,MAAO7Q,EAAO6Q,MACdC,OAAQ9Q,EAAO8Q,OACf5P,KAAMC,EAAKzE,eAAesD,EAAO5C,YACjC2T,MAAO/Q,EAAO+Q,OAQhB,GANOC,EAAAA,cAAchf,EAAE7E,MACN,eAAb+iB,IACFlQ,EAAOiR,aAAejR,EAAO9C,OAAS8C,EAAO9C,MAAMqC,aAIpC,eAAb2Q,EAA2B,CAC7B,IAAMgB,EAAQlR,EAAO9C,MAAQ8C,EAAO9C,MAAMiU,aAAe,EACrDD,GAAAA,GAASlR,EAAOkR,QAAUA,EAC5B,OAEFlR,EAAOkR,MAAQlR,EAAO9C,OAAS8C,EAAO9C,MAAMiU,aAiB1CnR,GAda,mBAAbkQ,IACKkB,EAAAA,UAAYpR,EAAO9C,MAAMgB,UAGjB,iBAAbgS,IACImB,EAAAA,cAAgBrR,EAAOsR,aAAetR,EAAO6Q,MACnD7Q,EAAOsR,WAAatR,EAAO6Q,OAGZ,UAAbX,IACI5lB,EAAAA,MAAQ+lB,GAAQrQ,EAAO/C,MAAM3S,OAIjC0V,EAAOuR,qBAAqBrB,GAAW,CACzC,IAAM7T,EAAW4T,GAAe3Y,KAAK0I,EAAQkQ,EAAUI,GACnD,IACFtQ,EAAOuR,qBAAqBrB,GAAUpe,KAAKkO,EAAQsQ,EAAOjU,SACnD3K,GAEDA,MADSI,GAAAA,KAAKkO,EAAQkQ,EAAUI,GAChC5e,QAGOI,GAAAA,KAAKkO,EAAQkQ,EAAUI,IAQtCkB,IAAAA,YAAUnK,GAAAC,EAAAkK,EAAAnK,GAAAE,IAAAA,EAAAC,EAAAgK,GAId,SAAAA,EAAahkB,GAASikB,IAAAA,EAAAplB,OAAAmlB,IACpBjK,EAAAA,EAAAzV,UAAMtE,IAKDkkB,WAAY,EAKjBD,EAAKR,aAAe,EAKpBQ,EAAKL,UAAY,EAKjBK,EAAKb,YAAc,GAKnBa,EAAKH,YAAa,EAMlBG,EAAKV,MAAQ,MAMbU,EAAKP,OAAQ,EAKbO,EAAKE,YAAc5gB,OAAO6gB,OAAO,GAAI,CACnCC,UAAU,EACVC,SAAUtkB,EAAQskB,SAClBC,YAAavkB,EAAQukB,YACrB,iBAAkBvkB,EAAQukB,YAC1B,qBAAsBvkB,EAAQukB,YAC9B,6BAA8BvkB,EAAQ,+BAAiCA,EAAQwkB,wBAC/E,uBAAwBxkB,EAAQ,yBAA2BA,EAAQykB,mBACnEC,QAAS1kB,EAAQ0kB,QACjB,iBAAkB1kB,EAAQ0kB,QAC1BC,SAA6B,EAAnB3kB,EAAQ2kB,SAClBC,UAAW5kB,EAAQ4kB,WAAa,QAChC,cAAc,GACb5kB,EAAQmiB,YAAaniB,EAAQ6kB,iBAM1BC,IAAAA,EAAa9kB,EAAQ,yBAA2BA,EAAQ+kB,kBAwDtCd,OAvDpBe,GAAQlE,UAAYkE,GAAQ/F,GAAGkB,WAAa2E,IAC9Cb,EAAKE,YAAY,wBAA0BW,SACpCb,EAAKE,YAAYI,mBACjBN,EAAKE,YAAY,6BACjBF,EAAKE,YAAY,mBAGtBnkB,EAAQilB,OACVhB,EAAKE,YAAYc,KAAO,QAItBjlB,EAAQklB,gBAAkB3hB,OAAOa,UAAUgT,eAAe9S,KAAK2f,EAAKE,YAAa,WACnFF,EAAKE,YAAYd,OAAQ,GAMtB3T,EAAAA,MACH1P,EAAQmlB,mBAAmBxV,iBACvB3P,EAAQmlB,QACmB,mBAApBnlB,EAAQmlB,QACbnlB,EAAQmlB,QAAQlB,EAAKE,aACrBxQ,EAAK9Q,UAAUohB,EAAKE,YAAYS,UAAW,GAAIX,EAAKE,YAAa,IAErEnkB,EAAQolB,sBACVnB,EAAKvU,MAAM0V,oBAAsBnB,EAAKvU,MAAMiU,aAAe3jB,EAAQolB,qBAGjC,WAAhCzR,EAAKpO,OAAOvF,EAAQsjB,UACtBW,EAAKX,OAAStjB,EAAQsjB,QAGpBtjB,EAAQklB,gBACVjB,EAAKvU,MAAM2T,OAAQ,EACnBY,EAAKH,YAAa,GAEhB9jB,EAAQskB,WACVL,EAAKvU,MAAM4U,UAAW,GAIpBtkB,EAAQukB,cACVN,EAAKvU,MAAM6U,aAAc,GAM3BN,EAAKpa,UAAY,GAIjBoa,EAAKF,qBAAuB,GAC5BE,EAAKoB,oBAAmBpB,EAgpBzBD,OA7oBDllB,EAAAklB,EAAA,CAAA,CAAAjlB,IAAA,sBAAAC,MAIA,SAAqBsmB,GAAa,IAAAC,EAAA1nB,KAChC0F,OAAOC,KAAK8hB,GAAa7f,KAAI,SAAA1G,GACtBglB,EAAAA,qBAAqBhlB,GAAOumB,EAAYvmB,QAIjD,CAAAA,IAAA,yBAAAC,MAIA,SAAwBsmB,GAAa,IAAAE,EAAA3nB,KACnC0F,OAAOC,KAAK8hB,GAAa7f,KAAI,SAAA1G,UACpBymB,EAAKzB,qBAAqBhlB,QAIrC,CAAAA,IAAA,oBAAAC,MAIA,WAAuC,IAAAymB,EAAA5nB,KAApB6R,EAAKlS,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAAK,KAAK6R,MACzB7R,KAAK6nB,cAIR7nB,KAAK6nB,YAAc7O,GAAapR,KAAI,SAAAid,GAClC,IAAMiD,OAAO1nB,OAAQykB,EAASkD,OAAO,GAAGC,eAAa5nB,OAAGykB,EAAS3c,MAAM,IAKvE,MAJ6B,mBAAlB0f,EAAKE,IACTvM,EAAAA,GAAGsJ,EAAU+C,EAAKE,IAGzBG,KACGpD,EAAWE,GAAqBF,EAAU+C,QAK5CC,KAAAA,YAAYjiB,SAAQ,SAAAC,GACvB,IAAMgf,EAAWnf,OAAOC,KAAKE,GAAM,GACnCgM,EAAMqW,iBAAiBrD,EAAUhf,EAAKgf,IAAW,QAIrD,CAAA3jB,IAAA,oBAAAC,MAIA,WAAuC,IAAAgnB,EAAAnoB,KAApB6R,EAAKlS,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAAK,KAAK6R,MACzBgW,KAAAA,YAAYjiB,SAAQ,SAAAC,GACvB,IAAMgf,EAAWnf,OAAOC,KAAKE,GAAM,GACnCgM,EAAMuW,oBAAoBvD,EAAUhf,EAAKgf,IAAW,MAGjDgD,KAAAA,YAAYjiB,SAAQ,SAAAC,GACvB,IAAMgf,EAAWnf,OAAOC,KAAKE,GAAM,GAC7BiiB,OAAO1nB,OAAQykB,EAASkD,OAAO,GAAGC,eAAa5nB,OAAGykB,EAAS3c,MAAM,IAC1C,mBAAlBigB,EAAKL,IACTrM,EAAAA,IAAIoJ,EAAUsD,EAAKL,OAI5B9nB,KAAK6nB,YAAc,OAGrB,CAAA3mB,IAAA,iBAAAC,MAKA,SAAgBknB,EAAMf,GAAS,IAAAgB,EAAAtoB,KACvB6R,EAAQyV,GAAWtnB,KAAK6R,OAAS7R,KAAK4R,MACvChM,EAAAA,SAAQ,SAACC,EAAMzE,GAClByQ,EAAMoB,YAAY6C,EAAK9Q,UAAU,SAAU,GAAI,CAC7C2F,OAAGvK,OAAKyF,EAAK8E,KACb7I,KAAI,GAAA1B,OAAKyF,EAAK/D,MAAQ,IACtB,aAAcV,EAAQ,QAI1B,IAAMmnB,EAAK1W,EAAM1L,SAKjBnG,KAAKwoB,kBAAoBD,EAAG3oB,OAE5BI,KAAKyoB,kBAAoBF,EAAG3oB,OAO5B,IAFA,IAAI8oB,EAAY,KAEP/mB,EAAI,EAAGA,EAAI3B,KAAK6nB,YAAYjoB,OAAQ+B,IAC3C,GAA4C,UAAxC+D,OAAOC,KAAK3F,KAAK6nB,YAAYlmB,IAAI,GAAgB,CACnD+mB,EAAY1oB,KAAK6nB,YAAYlmB,GAC7B,OAKH3B,KAAK2oB,eAAiB3oB,KAAK2oB,aAAe,SAAChiB,GAC1C,IAAMiiB,EAAU/a,SAASlH,EAAEqD,OAAOnD,aAAa,cAAe,IAE9D,GADK4hB,EAAAA,oBAC0B,IAA3BH,EAAKG,mBAA2BG,GAAWN,EAAKE,kBAAmB,CACrE,IAAMxD,EAAO,CAAEtP,KAAM,EAAGlW,QAAS,sBACrBkpB,EAAAA,EAAUzpB,MAAM0H,EAAGqe,GAAQsD,EAAKxD,aAAa,QAASE,GAEpE,IAAMljB,EAAO0S,EAAe,GAC5B8T,EAAKvN,KAAKjC,GAAc,IAAIpE,EAAO4T,EAAM,CACvCzT,UAAW/S,EACXgT,UAAW,EACXC,aAAc,qBACdG,WAAY,CAAEQ,KAAM,EAAGlW,QAAS,sBAChCmL,IAAKhE,EAAEqD,OAAOW,SAGlB,IAAA,IAAShJ,EAAI,EAAGA,EAAI4mB,EAAG3oB,OAAQ+B,IAC7B4mB,EAAG5mB,GAAGumB,iBAAiB,QAASloB,KAAK2oB,gBAIzC,CAAAznB,IAAA,oBAAAC,MAIA,SAAmBmmB,GACjB,IAAMzV,EAAQyV,GAAWtnB,KAAK6R,OAAS7R,KAAK4R,MACtC2W,EAAK1W,EAAM1L,SACjB,GAAKoiB,GAAoB,IAAdA,EAAG3oB,QAAiBI,KAAK2oB,aAApC,CAGA,IAAA,IAAShnB,EAAI,EAAGA,EAAI4mB,EAAG3oB,OAAQ+B,IAC7B4mB,EAAG5mB,GAAGymB,oBAAoB,QAASpoB,KAAK2oB,cAEnCJ,KAAAA,EAAG3oB,OAAS,GACXipB,EAAAA,YAAYN,EAAG,OAIzB,CAAArnB,IAAA,sBAAAC,MAOA,SAAqByQ,EAAOyW,GAAM,IAAAS,EAAA9oB,KAChC4R,EAAMmX,gBAAgB,OACtBnX,EAAMoX,OAEDC,KAAAA,eAAerX,EAAOyW,GAEhBzW,EAAMzL,WAKZ+iB,KAAAA,aAAe,SAACviB,GACnBmiB,EAAK/N,KAAKhC,GAAgB,CAAEpO,IAAKhE,EAAEqD,OAAO+H,WAAY8D,KAAMC,EAAKzE,eAAe1K,EAAEqD,OAAO+H,eAGrFmW,EAAAA,iBAAiB,aAAcloB,KAAKkpB,iBAG5C,CAAAhoB,IAAA,sBAAAC,MAKA,SAAqByQ,GACnB5R,KAAKmpB,kBAAkBvX,GACvB5R,KAAKkpB,cAAgBtX,EAAMwW,oBAAoB,aAAcpoB,KAAKkpB,gBAGpE,CAAAhoB,IAAA,eAAAC,MAIA,SAAcuK,GAAMzM,IAAAA,EAAKU,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,KAC1B,GAAIK,KAAK6R,QAAU7R,KAAK6R,MAAM5S,OAASA,GAAQ,CACzCmqB,IAAAA,EAAKppB,KAAK6R,MAAM5S,OAASA,EACvB6C,EAAOsnB,EAAG1T,KAAOlB,EAAe4U,EAAG1T,MAAQ,QACnC0T,EAAG5pB,QACXQ,KAAK6R,MAAME,YAAc/R,KAAK6R,MAAMwX,YAEnCD,EAAA,CACH1T,KAAM,EACNlW,QAHQ,cAMZQ,KAAK+a,KAAKrP,EAAM,IAAIgJ,EAAO1U,KAAM,CAC/B6U,UAAW/S,EACXgT,UAAWsU,EAAG1T,KACdX,aAAcqU,EAAG5pB,SAAW,GAC5B0V,WAAYkU,QAGjB,CAAAloB,IAAA,UAAAC,MAED,WAYamoB,IAAAA,IAAAA,KAXPtpB,KAAK6R,QACH7R,KAAK6R,MAAM0X,QACbvpB,KAAK6R,MAAM0X,QACXvpB,KAAK6R,MAAM2T,OAAQ,GAEhB3T,KAAAA,MAAMkX,gBAAgB,OAC3B/oB,KAAK6R,MAAMmX,QAEbhpB,KAAK4lB,aAAe,EACpB5lB,KAAK+lB,UAAY,EACjB/lB,KAAKsmB,YAAc,KACHtmB,KAAKgM,UACftG,OAAOa,UAAUgT,eAAe9S,KAAKzG,KAAKgM,UAAWsd,KACzCpd,cAAAlM,KAAKgM,UAAUsd,IAC7BtpB,KAAKgM,UAAUsd,GAAK,MAGxBtpB,KAAKwpB,oBACLxpB,KAAK6R,MAAQ,KACb7R,KAAKkmB,qBAAuB,GAC5BlmB,KAAKwb,uBAGP,CAAAta,IAAA,QAAAK,IAIA,WACE,OAAOvB,KAAK6R,OAGd4X,IAIA,SAAW5X,GACT7R,KAAK6R,MAAQA,IAGf,CAAA3Q,IAAA,OAAAC,MAIA,WAES+N,OADKlP,KAAK6R,MAAQ7R,KAAK6R,MAAM6X,OAAS,OAE9C,CAAAxoB,IAAA,QAAAC,MAED,WACO0Q,KAAAA,OAAS7R,KAAK6R,MAAM0X,UAC1B,CAAAroB,IAAA,OAAAC,MAED,WACO0Q,KAAAA,OAAS7R,KAAK6R,MAAMmX,SAG3B,CAAA9nB,IAAA,cAAAC,MAKA,SAAaW,GACX,QAAO9B,KAAK6R,OAAQ7R,KAAK6R,MAAM0R,YAAYzhB,KAG7C,CAAAZ,IAAA,mBAAAC,MAKA,SAAkBkP,GACVsZ,IAAAA,EAAQ,CAAC,EAAG,GACd,IAAC3pB,KAAK6R,MACD8X,OAAAA,EAEJtZ,IACHA,EAAWrQ,KAAK6R,MAAMxB,UAElB6D,IAAAA,EAAclU,KAAK6R,MAAMqC,YAC/B,GAAI7D,EACF,IAAA,IAAS1O,EAAI,EAAGC,EAAMyO,EAASzQ,OAAQ+B,EAAIC,IACnC+nB,EAAA,GAAKtZ,EAAShP,MAAMM,GACpBgoB,EAAA,GAAKtZ,EAAS/O,IAAIK,KACpBgoB,EAAM,IAAMzV,GAAeA,GAAeyV,EAAM,KAHNhoB,KAQlD,OAAIgoB,EAAM,GAAKzV,GAAe,GAAKA,EAAcyV,EAAM,IAAM,EACpDA,EAEA,CAAC,EAAG,KAIf,CAAAzoB,IAAA,WAAAK,IAQA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAM4U,UAGjCgD,IARA,SAAcG,GACP/X,KAAAA,QAAU7R,KAAK6R,MAAM4U,SAAWmD,KACtC,CAAA1oB,IAAA,WAAAK,IAUD,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAMxB,SAAW,OAG5C,CAAAnP,IAAA,YAAAK,IAIA,WACS,OAAAvB,KAAK6R,OAAS7R,KAAK6R,MAAMxB,SAAWyF,EAAK5F,aAAalQ,KAAK6R,MAAMxB,UAAY,OAGtF,CAAAnP,IAAA,gBAAAK,IAGA,WACE,IAAM2N,EAAM,CACV7N,MAAO,EACPC,IAAK,GAEH,IAACtB,KAAK6R,MACD3C,OAAAA,EAEH2a,IAAAA,EAAY7pB,KAAK6R,MAAMxB,SAC7B,IAAKwZ,GAAkC,IAArBA,EAAUjqB,OACnBsP,OAAAA,EAET,IAAA,IAASvN,EAAI,EAAGA,EAAIkoB,EAAUjqB,OAAQ+B,IACpC,IAAKkoB,EAAUxoB,MAAMM,IAAM3B,KAAKkU,aAAe2V,EAAUxoB,MAAMM,GAAK,KAAQkoB,EAAUvoB,IAAIK,IAAM3B,KAAKkU,YAC5F,MAAA,CACL7S,MAAOwoB,EAAUxoB,MAAMM,GACvBL,IAAKuoB,EAAUvoB,IAAIK,IAIlBuN,OAAAA,IAGT,CAAAhO,IAAA,cAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAMiY,YAAc,IAC9CL,IAED,SAAiBG,GACV/X,KAAAA,QAAU7R,KAAK6R,MAAMiY,YAAcF,KAG1C,CAAA1oB,IAAA,aAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAME,WAAa,IAC7C0X,IAED,SAAgB9e,GACTkH,KAAAA,QAAU7R,KAAK6R,MAAME,WAAapH,KAGzC,CAAAzJ,IAAA,cAAAK,IAIA,WACM,OAACvB,KAAK6R,WAGwBxO,IAA3BrD,KAAK6R,MAAMqC,YAA4BlU,KAAK6R,MAAMqC,YAAclU,KAAK4lB,aAFnE,GAGV6D,IAED,SAAiBvmB,GACV2O,KAAAA,QAAU7R,KAAK6R,MAAMqC,YAAchR,KAG1C,CAAAhC,IAAA,eAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMkY,cAChCN,IAED,SAAkBG,GACX/X,KAAAA,QAAU7R,KAAK6R,MAAMkY,aAAeH,KAG3C,CAAA1oB,IAAA,WAAAK,IAIA,WACE,OAAOvB,KAAK+lB,YAGd,CAAA7kB,IAAA,QAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMwD,QAGjC,CAAAnU,IAAA,QAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAM5S,QAGpB,CAAAiC,IAAA,YAAAK,IAIA,WAEE,IADYvB,KAAK6R,MAAM5S,MAEd,MAAA,GAQT,MANe,CACb,oBACA,oBACA,mBACA,+BAEYe,KAAK6R,MAAM5S,MAAMyW,KAAO,KAGxC,CAAAxU,IAAA,OAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMuV,MAChCqC,IAED,SAAUG,GACH/X,KAAAA,QAAU7R,KAAK6R,MAAMuV,KAAOwC,KAGnC,CAAA1oB,IAAA,QAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAM2T,OAChCiE,IAED,SAAWG,GACJ5pB,KAAK6R,OAAS7R,KAAK6R,MAAM2T,QAAUoE,IAGnC3D,KAAAA,WAAajmB,KAAK6R,MAAM2T,MAC7BxlB,KAAK6R,MAAM2T,MAAQoE,KAGrB,CAAA1oB,IAAA,eAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAM2D,eAGpB,CAAAtU,IAAA,SAAAK,IAIA,WACE,OAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMwT,SAGjC,CAAAnkB,IAAA,eAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAMiU,aAAe,GAC/C2D,IAED,SAAkBO,GACXhqB,KAAK6R,OAASmY,IAASC,EAAAA,IAG5BjqB,KAAK6R,MAAM0V,oBAAsByC,EACjChqB,KAAK6R,MAAMiU,aAAekE,KAG5B,CAAA9oB,IAAA,SAAAK,IAGA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAMqY,OAAS,OAG1C,CAAAhpB,IAAA,UAAAK,IAGA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMsY,SAChCV,IAED,SAAaG,GACN/X,KAAAA,QAAU7R,KAAK6R,MAAMsY,QAAUP,KAGtC,CAAA1oB,IAAA,aAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAM0D,aAGpB,CAAArU,IAAA,WAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMuY,WAGjC,CAAAlpB,IAAA,UAAAK,IAIA,WACE,QAAOvB,KAAK6R,OAAQ7R,KAAK6R,MAAMwY,UAGjC,CAAAnpB,IAAA,MAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAMlH,IAAM,IACtC8e,IAED,SAASxe,GACFjL,KAAK6R,QAGLkJ,KAAAA,KAAKpD,GAAY1M,GACtBjL,KAAK+a,KAAKtE,GAEVzW,KAAK4lB,aAAe,EACpB5lB,KAAK+lB,UAAY,EAEbjQ,EAAKnE,MAAM3R,KAAK6R,OAClB7R,KAAKsqB,aAGFC,KAAAA,oBAAoBvqB,KAAK6R,OACL,UAArBiE,EAAKpO,OAAOuD,GACTuf,KAAAA,oBAAoBxqB,KAAK6R,MAAO5G,GAC5BA,EACTjL,KAAK6R,MAAMlH,IAAMM,EAEZ4G,KAAAA,MAAMkX,gBAAgB,OAE7B/oB,KAAKgpB,WAGP,CAAA9nB,IAAA,SAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAM4T,OAAS,GACzCgE,IAED,SAAYgB,GACNA,IAAQR,EAAAA,GAAajqB,KAAK6R,QAG9B7R,KAAK6R,MAAM4T,OAASgF,KAGtB,CAAAvpB,IAAA,cAAAK,IAIA,WACE,OAAOvB,KAAK6R,MAAQ7R,KAAK6R,MAAM6Y,WAAa1qB,KAAK6R,MAAM8Y,YAAc,IACtE,CAAAzpB,IAAA,aAAAC,MAED,SAAYqI,GACVxJ,KAAKulB,YAAY/b,IAAS,IAC3B,CAAAtI,IAAA,gBAAAC,MAED,SAAeqI,UACNxJ,KAAKulB,YAAY/b,KAI1B,CAAAtI,IAAA,OAAAC,MAKA,SAAMqI,EAAOohB,GAAe,IAAAC,IAAAA,EAAAnrB,EAAAC,UAAAC,OAANuD,MAAIrD,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAA,EAAAA,EAAAJ,GAAAA,UAAAI,IACxB8qB,EAAAC,EAAAC,EAAA5E,EAAA5f,WAAAE,OAAAA,OAAAA,KAAAtG,MAAA0qB,EAAWrhB,CAAAA,KAAAA,EAAOohB,GAAIxqB,OAAK+C,MAG7B,CAAAjC,IAAA,KAAAC,MAKA,SAAIqI,EAAOwH,GAAmB,IAAAga,IAAAA,EAAAzqB,EAAAZ,UAAAC,OAANuD,MAAIrD,MAAAS,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAb,GAAAA,UAAAa,IAC1BwqB,EAAAF,EAAAC,EAAA5E,EAAA5f,WAAAE,KAAAA,OAAAA,KAAAtG,MAAA6qB,EAASxhB,CAAAA,KAAAA,EAAOwH,GAAQ5Q,OAAK+C,MAG/B,CAAAjC,IAAA,OAAAC,MAKA,SAAMqI,EAAOwH,GAAmB,IAAAia,IAAAA,EAAArqB,EAAAjB,UAAAC,OAANuD,MAAIrD,MAAAc,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAlB,GAAAA,UAAAkB,IAC5BoqB,EAAAH,EAAAC,EAAA5E,EAAA5f,WAAAE,OAAAA,OAAAA,KAAAtG,MAAA8qB,EAAWzhB,CAAAA,KAAAA,EAAOwH,GAAQ5Q,OAAK+C,MAGjC,CAAAjC,IAAA,MAAAC,MAMA,SAAKqI,EAAOwH,GAAmB,IAAAka,IAAAA,EAAAC,EAAAxrB,UAAAC,OAANuD,MAAIrD,MAAAqrB,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAzrB,GAAAA,UAAAyrB,IAC3BF,EAAAJ,EAAAC,EAAA5E,EAAA5f,WAAAE,MAAAA,OAAAA,KAAAtG,MAAA+qB,EAAU1hB,CAAAA,KAAAA,EAAOwH,GAAQ5Q,OAAK+C,MAC/B,CAAAjC,IAAA,SAAAC,MAED,WACE4pB,EAAAA,EAAA5E,EAAA5f,sCAAAE,KAAAzG,UACDmmB,GA1wBsBhM,IC3GnBkR,GAAO,WACX,SAAAA,IAAaC,IAAAA,EAAI3rB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAE+L,KAAM,WAAYjN,QAAS,EAAG8sB,GAAI,KAAMC,QAAS,CAAE9f,KAAM,SAAU+f,QAAS,QAASzqB,OAAAqqB,GACpGK,KAAAA,UAAY/sB,OAAO+sB,WAAa/sB,OAAOgtB,gBACvCC,KAAAA,YAAcjtB,OAAOitB,aAAejtB,OAAOktB,kBAChD7rB,KAAK8rB,KAAOR,EAsGbD,OArGApqB,EAAAoqB,EAAA,CAAA,CAAAnqB,IAAA,SAAAC,MAED,SAAQ6P,GAAU,IAAAoV,EAAApmB,KAEV+rB,EAAO/rB,KACPvB,EAAUuB,KAAK8rB,KAAKrtB,SAAW,EAC/ButB,EAAUD,EAAKL,UAAUO,KAAKF,EAAKD,KAAKpgB,KAAMjN,GAC5C8Q,EAAAA,QAAU,SAAU5I,KAGpBulB,EAAAA,UAAY,SAAAvlB,GACbmlB,EAAAA,KAAKP,GAAK5kB,EAAEqD,OAAOzH,OAExByO,EAASvK,KAAKslB,IAERI,EAAAA,gBAAkB,SAAAxlB,GAClB4kB,IAAAA,EAAK5kB,EAAEqD,OAAOzH,OAEAoE,EAAEqD,OAAOoiB,YAGxBb,EAAGc,iBAAiBC,SAASP,EAAKD,KAAKN,QAAQ9f,OAG1C6f,EAAGgB,kBAAkBR,EAAKD,KAAKN,QAAQ9f,KAAM,CAAE8gB,QAAST,EAAKD,KAAKN,QAAQC,aAIvF,CAAAvqB,IAAA,WAAAC,MAED,WAEenB,KACR0rB,UAAUe,eAAezsB,KAAK8rB,KAAKpgB,QAEzC,CAAAxK,IAAA,UAAAC,MAED,WAEO2qB,KAAAA,KAAKP,GAAGmB,UAEd,CAAAxrB,IAAA,UAAAC,MAED,SAASwrB,EAAW/B,GAIlB,IAFM/O,IACFmQ,EADEnQ,EAAQ7b,KAAK8rB,KAAKP,GAAGa,YAAYO,EAAW,aAAaC,YAAYD,GAElEhrB,EAAI,EAAGA,EAAIipB,EAAKhrB,OAAQ+B,KACrBka,EAAAA,EAAM3U,IAAI0jB,EAAKjpB,KACjB4N,QAAU,aAGlByc,EAAQE,UAAY,eAIvB,CAAAhrB,IAAA,UAAAC,MAED,SAASwrB,EAAW/B,GAIlB,IAFM/O,IACFmQ,EADEnQ,EAAQ7b,KAAK8rB,KAAKP,GAAGa,YAAYO,EAAW,aAAaC,YAAYD,GAElEhrB,EAAI,EAAGA,EAAIipB,EAAKhrB,OAAQ+B,KACrBka,EAAAA,EAAMgR,IAAIjC,EAAKjpB,KACjB4N,QAAU,aAGlByc,EAAQE,UAAY,eAIvB,CAAAhrB,IAAA,eAAAC,MAED,SAAcwrB,EAAWzrB,EAAK8P,GAC5B,IAAM+a,EAAO/rB,KAGPgsB,EADQhsB,KAAK8rB,KAAKP,GAAGa,YAAYO,EAAW,aAAaC,YAAYD,GACrDprB,IAAIL,GAC1B8qB,EAAQzc,QAAU,WAEP9I,EAAAA,KAAKslB,EAAM,OAEdG,EAAAA,UAAY,SAAUvlB,GACtBpE,IAAAA,EAASoE,EAAEqD,OAAOzH,OAEfkE,EAAAA,KAAKslB,EAAMxpB,MAEvB,CAAArB,IAAA,aAAAC,MAED,SAAYwrB,EAAWzrB,GAEPlB,KAAK8rB,KAAKP,GAAGa,YAAYO,EAAW,aAAaC,YAAYD,GACrEG,OAAO5rB,KAEd,CAAAA,IAAA,YAAAC,MAED,SAAWwrB,GAEK3sB,KAAK8rB,KAAKP,GAAGa,YAAYO,EAAW,aAAaC,YAAYD,GACrEI,YAEP1B,EA1GU,GCAA2B,GAAoB,CAAC,mBAAoB,yBAA0B,sBAAuB,sBAE1FC,GAAqB,CAAC,oBAAqB,0BAA2B,uBAAwB,uBAE9FC,GAAsB,CAAC,iBAAkB,uBAAwB,sBAAuB,oBAExFC,GAAY,kBCNhBC,SAAAA,GAAa7iB,EAAK8iB,EAASC,GAAe,IAAA,IAAA5tB,EAAAC,UAAAC,OAANuD,MAAIrD,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAA,EAAAA,EAAAJ,GAAAA,UAAAI,GACzCmP,IAAAA,EAAMme,EAAQ5mB,KAAItG,MAAZktB,GAAa9iB,GAAGnK,OAAK+C,IAC5BmqB,GAAwB,mBAATA,IAGhBpe,GAAOA,EAAIqe,KACbre,EAAIqe,MAAK,WAAa,IAAA,IAAAhtB,EAAAZ,UAAAC,OAATuD,EAAIrD,IAAAA,MAAAS,GAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJ2C,EAAI3C,GAAAb,UAAAa,GACViG,EAAAA,KAAItG,MAATmtB,EAAU/iB,CAAAA,GAAGnK,OAAK+C,OAGfsD,EAAAA,KAAItG,MAATmtB,EAAU/iB,CAAAA,GAAGnK,OAAK+C,KAcbqqB,SAAAA,GAAMC,EAAUJ,GAASK,IAAAA,EAAM/tB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEguB,IAAK,KAAML,KAAM,MAK5D,OAJKttB,KAAK4tB,UACR5tB,KAAK4tB,QAAU,KAEhB5tB,KAAK4tB,QAAQH,KAAcztB,KAAK4tB,QAAQH,GAAY,MAC9C,WAAYjmB,IAAAA,EAAA7H,UAAAymB,EAAApmB,KACjB,GAAI0tB,EAAOC,IACL,IAAAE,IAAAA,GACFA,EAAAH,EAAOC,KAAIlnB,KAAItG,MAAA0tB,EAAA,CAAC7tB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,mBAClBgH,GAEDA,MADNA,EAAEnH,QAAO,gBAAAY,OAAmBJ,KAAK8tB,WAAU,KAAA1tB,OAAIqtB,EAAQrtB,mBAAAA,OAAkBuG,EAAEnH,SACrEmH,EAGV,GAAI3G,KAAK4tB,SAAW5tB,KAAK4tB,QAAQH,GAC3B,IACF,IAAMM,EAASC,GAAQ7tB,WAAC,EAAA,CAAAH,KAAMytB,EAAUJ,GAAOjtB,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,aAChDouB,EACEA,EAAOR,KACFA,EAAAA,MAAK,SAACU,IACQ,IAAfA,GACFb,GAAWjtB,WAAA,EAAA,CAACimB,EAAMiH,EAASK,EAAOJ,MAAIltB,OAAA2K,EAAKpL,QAG5CuuB,OAAM,SAAAvnB,GACDA,MAAAA,KAGRymB,GAAWjtB,WAAC,EAAA,CAAAH,KAAMqtB,EAASK,EAAOJ,MAAIltB,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,kBAGzB0D,IAAX0qB,GACTX,GAAWjtB,WAAC,EAAA,CAAAH,KAAMqtB,EAASK,EAAOJ,MAAIltB,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,mBAEtCgH,GAEDA,MADNA,EAAEnH,QAAO,gBAAAY,OAAmBJ,KAAK8tB,WAAU,KAAA1tB,OAAIqtB,EAAQrtB,SAAAA,OAAQuG,EAAEnH,SAC3DmH,OAGRymB,GAAWjtB,WAAC,EAAA,CAAAH,KAAMqtB,EAASK,EAAOJ,MAAIltB,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,cAE7CsM,KAAKjM,MAGAmuB,SAAAA,GAAeV,EAAUJ,GAChC,IAAQO,EAAY5tB,KAAZ4tB,QACR,IAAKA,IAAY9tB,MAAMsuB,QAAQR,EAAQH,IAC9B,OAAA,EAGT,IADA,IAAMY,EAAeT,EAAQH,GACpB9rB,EAAI,EAAGA,EAAI0sB,EAAazuB,OAAQ+B,IACnC0sB,GAAAA,EAAa1sB,KAAO0rB,EACf1rB,OAAAA,EAGJ,OAAA,EAQA2sB,SAAAA,GAAUb,EAAUJ,GAC3B,IAAQO,EAAY5tB,KAAZ4tB,QACR,GAAKA,EAIL,OAAKA,EAAQrU,eAAekU,IAIvB3tB,MAAMsuB,QAAQR,EAAQH,MACzBG,EAAQH,GAAY,KAGkC,IAApDU,GAAc1nB,KAAKzG,KAAMytB,EAAUJ,IAC7BI,EAAAA,GAAU9lB,KAAK0lB,IAElB,IAVLptB,QAAQf,KAAI,qCAAAkB,OAAsCqtB,SAC3C,GAkBFc,SAAAA,GAAad,EAAUJ,GAC9B,IAAQO,EAAY5tB,KAAZ4tB,QACR,GAAKA,EAIL,GAAI9tB,MAAMsuB,QAAQR,EAAQH,IAAY,CACpC,IAAMe,EAAQZ,EAAQH,GAChBrsB,EAAQ+sB,GAAc1nB,KAAKzG,KAAMytB,EAAUJ,IAE/B,IAAdjsB,GACIiL,EAAAA,OAAOjL,EAAO,QAEbwsB,EAAQH,KACjBG,EAAQH,GAAY,MAUxB,SAASgB,GAAgBX,GACnB,GAAC9tB,KAAK0uB,SAAY1uB,KAAK0uB,QAAQZ,EAAWpM,eAA1C,CAGiD,IAArD,IAAMiN,EAAS3uB,KAAK0uB,QAAQZ,EAAWpM,eAAc9gB,EAAAjB,UAAAC,OAJfuD,MAAIrD,MAAAc,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAlB,GAAAA,UAAAkB,GAK1C,OAAO8tB,EAAOL,UAAYK,EAAOL,SAAQnuB,MAAfwuB,EAAmBxrB,IAG/C,SAASyrB,GAAmBd,GACtB,GAAC9tB,KAAK0uB,SAAY1uB,KAAK0uB,QAAQZ,EAAWpM,eAA1C,CAGJ,IAAMiN,EAAS3uB,KAAK0uB,QAAQZ,EAAWpM,eACvC,GAAIiN,EAAQ,CAAA,IAAA,IAAAxD,EAAAxrB,UAAAC,OAL6BuD,MAAIrD,MAAAqrB,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAzrB,GAAAA,UAAAyrB,GAM3C,OAAOuD,EAAOJ,aAAeI,EAAOJ,YAAWpuB,MAAlBwuB,EAAsBxrB,KASvD,SAAS0rB,GAAiB/S,GAAUgT,IAAAA,EAAWnvB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAChDmc,EAAS8R,QAAU,GACJkB,GAAAA,EAAYlnB,KAAI,SAAA/B,GAC7BiW,EAAS8R,QAAQ/nB,GAAQ,QAEpBkpB,OAAAA,eAAejT,EAAU,QAAS,CACvCva,IAAK,WACIua,OAAAA,EAAS8R,SAAWloB,OAAOC,KAAKmW,EAAS8R,SAAShmB,KAAI,SAAA1G,GACvD4a,GAAAA,EAAS8R,QAAQ1sB,GACZA,OAAAA,QAOjB,SAAS8tB,GAAoBlT,GAC3BA,EAAS8R,QAAU,KAGZI,SAAAA,GAAUzjB,EAAKkjB,EAAUJ,GAAkB,IAAA,IAAA4B,EAAAtvB,UAAAC,OAANuD,MAAIrD,MAAAmvB,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAvvB,GAAAA,UAAAuvB,GAChD,GAAI3kB,EAAIqjB,SAAW9tB,MAAMsuB,QAAQ7jB,EAAIqjB,QAAQH,IAAY,CACjDe,IAAAA,EAAQjkB,EAAIqjB,QAAQH,GACtBrsB,GAAQ,EAIN+tB,EAAoB,SAApBA,EAA8B5kB,EAAKkjB,EAAUJ,GAAkB,IAAA,IAAA+B,EAAAzvB,UAAAC,OAANuD,MAAIrD,MAAAsvB,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAJlsB,EAAIksB,EAAA1vB,GAAAA,UAAA0vB,GAGjE,GAFAjuB,IAEqB,IAAjBotB,EAAM5uB,QAAgBwB,IAAUotB,EAAM5uB,OACjCytB,OAAAA,EAAQ5mB,KAAItG,MAAZktB,EAAa9iB,CAAAA,EAAKA,GAAGnK,OAAK+C,IAGnC,IAAMqqB,EAAOgB,EAAMptB,GACb8N,EAAMse,EAAK/mB,KAAItG,MAATqtB,EAAI,CAAMjjB,EAAKA,GAAGnK,OAAK+C,IAC/B+L,OAAAA,GAAOA,EAAIqe,KACNre,EAAIqe,MAAK,SAAC3C,GACf,OAAgB,IAATA,EAAiB,KAAOuE,EAAiBhvB,cAACoK,EAAKkjB,EAAUJ,GAAOjtB,OAAK+C,OAC3E+qB,OAAM,SAAAvnB,GACP1G,QAAQf,KAAI,aAAAkB,OAAcqtB,EAAmB9mB,WAAAA,EAAEnH,aAEhC,IAAR0P,EACFigB,EAAiBhvB,WAAA,EAAA,CAACoK,EAAKkjB,EAAUJ,GAAOjtB,OAAK+C,KACnC,IAAR+L,QAAX,GAKKigB,OAAAA,EAAiBhvB,WAAA,EAAA,CAACoK,EAAKkjB,EAAUJ,GAAOjtB,OAAK+C,IAE7CkqB,OAAAA,EAAQ5mB,KAAItG,MAAZktB,EAAa9iB,CAAAA,EAAKA,GAAGnK,OAAK+C,IC5M5BmsB,SAAAA,GAAcxB,EAAY9X,GACxBvV,EAAAA,SAAQ,IAAAL,OAAK0tB,EAAU,4DAAA1tB,OAA2D4V,IAW7F,IAWMuZ,GAAU,WAoCd,SAAAA,EAAapsB,GAAMnC,OAAAuuB,GACbzZ,EAAK3H,gBAAgBnO,KAAKwvB,eAC5BxvB,KAAKwvB,aAAarsB,GAEpB0rB,GAAgB7uB,MAIhBA,KAAKyvB,OAAStsB,EAIdnD,KAAK0vB,SAAW,GAChB1vB,KAAK2vB,aAAe,GACftwB,KAAAA,OAAS8D,EAAK9D,QAAU,GAK7BW,KAAK2U,OAAS,KAKd3U,KAAK4vB,aAAe,GAKpB5vB,KAAK8tB,WAAa,GAClB9tB,KAAK6vB,OAAO1sB,GAnCbosB,OAsCDtuB,EAAAsuB,EAAA,CAAA,CAAAruB,IAAA,eAAAC,MAGA,SAAcgC,MAAQ,CAAAjC,IAAA,cAAAC,MACtB,cAAiB,CAAAD,IAAA,mBAAAC,MACjB,cAAsB,CAAAD,IAAA,iBAAAC,MACtB,cAAoB,CAAAD,IAAA,kBAAAC,MACpB,cAAqB,CAAAD,IAAA,UAAAC,MACrB,cAEA,CAAAD,IAAA,SAAAC,MAIA,SAAQgC,GACNnD,KAAK2U,OAASxR,EAAKwR,OACnB3U,KAAK4vB,aAAezsB,EAAKwR,QAAUxR,EAAKwR,OAAOtV,OAC1CyuB,KAAAA,WAAa3qB,EAAK2qB,WAAa3qB,EAAK2qB,WAAWpM,cAAgB1hB,KAAK8vB,YAAYhC,WAAWpM,cAChG1hB,KAAK+vB,OAAS5sB,EAAKwR,QAAUxR,EAAKwR,OAAOob,SAkC3C,CAAA7uB,IAAA,aAAAC,MAIA,SAAY4b,GACLA,IACHA,EAAO/c,KAAK+c,QAIhB,CAAA7b,IAAA,OAAAK,IAGA,WACE,OAAOvB,KAAK2U,OAAOoI,OACpB,CAAA7b,IAAA,OAAAK,IAED,WACE,OAAOvB,KAAK2U,OAAOS,OACpB,CAAAlU,IAAA,WAAAK,IAED,WACE,OAAOvB,KAAK2U,OAAOqb,WAGrB,CAAA9uB,IAAA,eAAAK,IAIA,WACE,IAAI6nB,EAAKtT,EAAK7F,oBAAsB,QAAU,QAIvCmZ,OAHHppB,KAAK4vB,cAAoD,UAAnC5vB,KAAK4vB,aAAaK,cAA+D,UAAnCjwB,KAAK4vB,aAAaK,eACxF7G,EAAKppB,KAAK4vB,aAAaK,cAElB7G,IAGT,CAAAloB,IAAA,KAAAC,MAMA,SAAIqI,EAAOwH,GAAU,IAAAoV,EAAApmB,KACdwJ,GAAUwH,GAAahR,KAAK2U,OAIZ,iBAAVnL,GACTxJ,KAAK0vB,SAASlmB,GAASwH,EAClB2D,KAAAA,OAAO4G,GAAG/R,EAAOwH,IACblR,MAAMsuB,QAAQ5kB,IACjB5D,EAAAA,SAAQ,SAACC,GACbugB,EAAKsJ,SAAS7pB,GAAQmL,EACjB2D,EAAAA,OAAO4G,GAAG1V,EAAMmL,MATVse,GAAAtvB,KAAK8tB,WAAY,gCAclC,CAAA5sB,IAAA,OAAAC,MAMA,SAAMqI,EAAOwH,GAAU,IAAA0W,EAAA1nB,KAChBwJ,GAAUwH,GAAahR,KAAK2U,OAIZ,iBAAVnL,GACTxJ,KAAK2vB,aAAanmB,GAASwH,EACtB2D,KAAAA,OAAOgF,KAAKnQ,EAAOwH,IACflR,MAAMsuB,QAAQ5kB,IACjB5D,EAAAA,SAAQ,SAACC,GACb6hB,EAAKiI,aAAa9pB,GAAQmL,EACrB2D,EAAAA,OAAOgF,KAAKnQ,EAAOwH,MATbse,GAAAtvB,KAAK8tB,WAAY,kCAclC,CAAA5sB,IAAA,MAAAC,MAMA,SAAKqI,EAAOwH,GAAU,IAAA2W,EAAA3nB,KACfwJ,GAAUwH,GAAahR,KAAK2U,OAIZ,iBAAVnL,UACFxJ,KAAK0vB,SAASlmB,GAChBmL,KAAAA,OAAO8G,IAAIjS,EAAOwH,IACdlR,MAAMsuB,QAAQ5kB,IACjB5D,EAAAA,SAAQ,SAACC,UACN8hB,EAAK+H,SAASlmB,GAChBmL,EAAAA,OAAO8G,IAAI5V,EAAMmL,MATXse,GAAAtvB,KAAK8tB,WAAY,iCAYjC,CAAA5sB,IAAA,SAAAC,MAED,WAAU,IAAAymB,EAAA5nB,KACR,CAAC,WAAY,gBAAgB4F,SAAQ,SAAA1E,GACnCwE,OAAOC,KAAKiiB,EAAK1mB,IAAM0E,SAAQ,SAAAC,GAC7B+hB,EAAK1mB,GAAK2E,IAAS+hB,EAAKnM,IAAI5V,EAAM+hB,EAAK1mB,GAAK2E,IACpCA,UAAO+hB,EAAK1mB,GAAK2E,SAG7B7F,KAAK0vB,SAAW,GAChB1vB,KAAK2vB,aAAe,KAGtB,CAAAzuB,IAAA,OAAAC,MAMA,SAAMqI,GAAe0mB,IAAAA,EACf,GAAClwB,KAAK2U,OAAN,CAEH,IAAA,IAAAjV,EAAAC,UAAAC,OAHauwB,MAAGrwB,MAAAJ,EAAAA,EAAAA,OAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAA,EAAAA,EAAAJ,GAAAA,UAAAI,IAIjBmwB,EAAIlwB,KAAC2U,QAAOoG,KAAI5a,MAAA+vB,GAAC1mB,GAAKpJ,OAAK+vB,OAC5B,CAAAjvB,IAAA,iBAAAC,MAED,SAAgBqI,EAAO4mB,GAAQC,IAAAA,EAAM1wB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAClC,GAACK,KAAK2U,OAAN,CAGE2b,IAAAA,EAAOC,EAAAA,KACRF,GAAM,GAAA,CACTvC,WAAY9tB,KAAK8tB,aAEnB9tB,KAAK2U,OAAO6b,eAAehnB,EAAO4mB,EAAQE,MAG5C,CAAApvB,IAAA,OAAAC,MAMA,SAAMssB,EAAUJ,GAEd,OAAOG,GAAK/mB,KAAItG,MAATqtB,IAAUxtB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAG5B,CAAAuB,IAAA,WAAAC,MAMA,SAAUssB,EAAUJ,GAAkB,IAAA,IAAA9sB,EAAAZ,UAAAC,OAANuD,MAAIrD,MAAAS,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAb,GAAAA,UAAAa,GAClC,OAAO8tB,GAAS7nB,KAAItG,MAAbmuB,IAActuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGhC,CAAAuB,IAAA,cAAAC,MAMA,SAAassB,EAAUJ,GAAkB,IAAA,IAAAzsB,EAAAjB,UAAAC,OAANuD,MAAIrD,MAAAc,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAlB,GAAAA,UAAAkB,GACrC,OAAO0tB,GAAY9nB,KAAItG,MAAhBouB,IAAiBvuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGnC,CAAAuB,IAAA,iBAAAC,MAOA,SAAgBwtB,GAAQxsB,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAI+L,EAAI/L,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACvC,GAACK,KAAK2U,OAIH,OADPjJ,IAASvJ,EAAQ2rB,WAAapiB,GACvB1L,KAAK2U,OAAO8b,eAAe,CAAE9B,OAAAA,EAAQxsB,QAAAA,MAG9C,CAAAjB,IAAA,YAAAC,MAKA,SAAWuK,GACT,OAAO1L,KAAK2U,OAAS3U,KAAK2U,OAAO+b,UAAUhlB,GAAQ,OACpD,CAAAxK,IAAA,YAAAC,MAED,WAAa,IAAAgnB,EAAAnoB,KACL2U,EAAS3U,KAAK2U,OACdmZ,EAAa9tB,KAAK8tB,WACxB9tB,KAAK2wB,SACL7a,EAAKxJ,eAAetM,MAChB8V,EAAK3H,gBAAgBnO,KAAK4wB,UAC5B5wB,KAAK4wB,UAGN,CAAA,SAAU,eAAgB,aAAc,SAAU,SAAU,WAAWhpB,KAAI,SAAA/B,GAC1EsiB,EAAKtiB,GAAQ,QAEf8O,EAAOkc,iBAAiB/C,GACxBkB,GAAmBhvB,SACpB,CAAA,CAAAkB,IAAA,uBAAAC,MAvUD,SAA6B2vB,EAAKlpB,GAChC,IAAA,IAAW1G,KAAO0G,EACZlC,OAAOa,UAAUgT,eAAe9S,KAAKmB,EAAK1G,IAC5CwE,OAAOqpB,eAAe+B,EAAK5vB,EAAK0G,EAAI1G,MAGzC,CAAAA,IAAA,eAAAC,MACD,SAAqB2vB,EAAKlpB,GACxB,IAAA,IAAW1G,KAAO0G,EACZlC,OAAOa,UAAUgT,eAAe9S,KAAKmB,EAAK1G,IAA4B,mBAAb0G,EAAI1G,IACxD6tB,OAAAA,eAAe+B,EAAK5vB,EAAK,CAC9B6vB,cAAc,EACd5vB,MAAOyG,EAAI1G,OAMnB,CAAAA,IAAA,gBAAAK,IAGA,WACE,MAAO,KAGT,CAAAL,IAAA,aAAAK,IAGA,WACS,MAAA,iBACRguB,EA/Ba,GCzBhB,GAAuB,oBAAZyB,UAA4BA,QAAQzqB,UAAU0qB,QAAS,CAC9D,IAAIC,GAAQF,QAAQzqB,UAEd0qB,GAAAA,QAAUC,GAAMC,iBACND,GAAME,oBACNF,GAAMG,mBACNH,GAAMI,kBACNJ,GAAMK,sBAoB1B,IChCIC,GDsBKA,SAASC,EAASC,GAChBD,KAAAA,GAvBc,IAuBHA,EAAQpmB,UAAiC,CACvD,GAA+B,mBAApBomB,EAAQR,SACfQ,EAAQR,QAAQS,GACXD,OAAAA,EAETA,EAAUA,EAAQE,aChB1B,SAASC,GAAUH,EAASC,EAAU5vB,EAAMkP,EAAU6gB,GAClD,IAAIC,EAAahY,GAAS3Z,MAAMH,KAAML,WAI/B,OAFCuoB,EAAAA,iBAAiBpmB,EAAMgwB,EAAYD,GAEpC,CACHjB,QAAS,WACGxI,EAAAA,oBAAoBtmB,EAAMgwB,EAAYD,KAgD1D,SAAS/X,GAAS2X,EAASC,EAAU5vB,EAAMkP,GACvC,OAAO,SAASrK,GACZA,EAAEorB,eAAiBP,GAAQ7qB,EAAEqD,OAAQ0nB,GAEjC/qB,EAAEorB,gBACOtrB,EAAAA,KAAKgrB,EAAS9qB,IAKnC,IAAAqrB,GA3CA,SAAkBC,EAAUP,EAAU5vB,EAAMkP,EAAU6gB,GAE9C,MAAqC,mBAA9BI,EAAS/J,iBACT0J,GAAUzxB,MAAM,KAAMR,WAIb,mBAATmC,EAGA8vB,GAAU3lB,KAAK,KAAM3G,UAAUnF,MAAM,KAAMR,YAI9B,iBAAbsyB,IACI3sB,EAAAA,SAAS4sB,iBAAiBD,IAIlCnyB,MAAMyG,UAAUqB,IAAInB,KAAKwrB,GAAU,SAAUR,GAChD,OAAOG,GAAUH,EAASC,EAAU5vB,EAAMkP,EAAU6gB,QCtD5CM,SAAAA,GAAYxD,EAAQyD,EAASC,GACvC,IACF,MAAAjyB,wBAAAA,OAA+BiyB,EAAS,OAAS,IAAG,gBAAAjyB,OAAeuuB,EAAOqB,SAASoC,GAAQ,YAAAhyB,OACzFuuB,EAAOvZ,KAAKgd,GAAQ,sBAEfzrB,GACA,MAAA,oCCEX,IAAM2rB,GAAa,CACjBC,SAAU,WACVC,KAAM,QAGFC,GAAY,CAChBD,KAAM,OACNE,UAAW,WACXC,WAAY,YACZC,SAAU,UACVC,cAAe,eACfC,eAAgB,gBAChBC,eAAgB,gBAChBC,gBAAiB,iBACjBT,SAAU,YAGNU,GACU,kBAQhB,SAASC,GAAO1qB,GACd,QAAKA,IAGEA,EAAI1J,SAAW,qBAAqB4O,KAAKlF,IAmBzC2qB,SAAAA,GAAYC,EAAMlyB,GAAK+E,IAAAA,EAAStG,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAI0zB,EAAI1zB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAImuB,EAAUnuB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAClE2zB,EAAU,KACVF,GAAAA,aAAgBz0B,OAAOqyB,QAKlBoC,OAJFhtB,EAAAA,SAASgtB,EAAMntB,GACpBP,OAAOC,KAAK0tB,GAAMzrB,KAAI,SAAA1G,GACf4E,EAAAA,aAAa5E,EAAKmyB,EAAKnyB,OAEvBkyB,EAGT,GAAIF,GAAME,IAASF,GAAME,EAAKnoB,KAGrBqoB,OAFPD,EAAK1oB,IAAMuoB,GAAME,GAAQA,EAAQA,EAAKnoB,KAAO,GACnC6K,EAAAA,EAAK9Q,UAAUouB,EAAKG,KAAO,MAAO,GAAIF,EAAI,UAAAjzB,OAAY6F,IAI9D,GAAgB,mBAATmtB,EACL,IAEEE,OADJA,EAAUF,eACaz0B,OAAOqyB,SACvB5qB,EAAAA,SAASktB,EAASrtB,GACvBP,OAAOC,KAAK0tB,GAAMzrB,KAAI,SAAA1G,GACZ4E,EAAAA,aAAa5E,EAAKmyB,EAAKnyB,OAE1BoyB,IAEEjzB,EAAAA,QAAO,eAAAD,OAAgBc,EAAG,gCAAAd,OAA+B0tB,EAAU,kDAEvE,YACAnnB,GAEA,OADPvH,EAASqB,SAAQL,iBAAAA,OAAkB0tB,EAAU,gBAAgBnnB,GACtD,KAIP,MAAgB,iBAATysB,EACFtd,EAAK/P,kBAAkBqtB,EAAMC,EAAMptB,IAEnC5F,EAAAA,QAAO,eAAAD,OAAgBc,EAAG,gCAAAd,OAA+B0tB,EAAU,iBACrE,MAGA0F,SAAAA,GAAkBC,EAAa9E,GACtC,IAAM+E,EAAS/E,EAAOtvB,OAAOs0B,OAAShF,EAAOiB,aAAa+D,MAC1DjuB,OAAOC,KAAK8tB,GAAa7rB,KAAI,SAAA1G,GAC3B,IAAM0yB,EAAUH,EAAYvyB,GACxB+E,EAAY2tB,GAAWA,EAAQC,MAAQD,EAAQC,MAAQ,GACvDR,EAAOO,GAAWA,EAAQP,KAAOO,EAAQP,KAAO,GAChDC,EAAU,KACVI,GAAUA,EAAOxyB,KACP4yB,EAlETA,SAAgBV,EAAMntB,GACzBlE,MAAgB,WAAhBA,EAAOqxB,IAAqBA,EAAKS,OAA+B,iBAAfT,EAAKS,MACxDzzB,GAAAA,OAAU6F,EAAS,KAAA7F,OAAIgzB,EAAKS,OAEvB5tB,EA8DS6tB,CAAeJ,EAAOxyB,GAAM+E,GACjC8tB,EA5DJA,SAAeX,EAAMC,GAMrBA,MALa,WAAhBtxB,EAAOqxB,IAAqBA,EAAKC,MAA6B,WAArBtxB,EAAOqxB,EAAKC,OACvD3tB,OAAOC,KAAKytB,EAAKC,MAAMzrB,KAAI,SAAA1G,GACpBA,EAAAA,GAAOkyB,EAAKC,KAAKnyB,MAGnBmyB,EAsDIU,CAAcL,EAAOxyB,GAAMmyB,GAClCC,EAAUH,GAAWO,EAAOxyB,GAAMA,EAAK+E,EAAWotB,EAAM1E,EAAOb,cAE5DwF,GAAWM,IACJT,EAAAA,GAAYS,EAAQR,KAAOQ,EAAQR,KAAOQ,EAAUP,EAAMptB,EAAW,GAAI0oB,EAAOb,aAE5Fa,EAAOgF,MAAMzyB,GAAOoyB,KAmClBU,IAAAA,YAAMC,GAAAhY,EAAA+X,EAAAC,GAAA/X,IAAAA,EAAAC,EAAA6X,GAyFV,SAAAA,IAAwB5N,IAAAA,EAAXjjB,EAAIxD,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAKGymB,OALDplB,OAAAgzB,IACpB9X,EAAAA,EAAAzV,UAAMtD,IAID+wB,YAAc,GAAE9N,EAVtB4N,OAaD/yB,EAAA+yB,EAAA,CAAA,CAAA9yB,IAAA,SAAAC,MAGA,SAAQgC,GAEF,GADJ4nB,EAAAA,EAAAiJ,EAAAztB,WAAA,SAAAvG,MAAAyG,KAAAzG,KAAamD,GACRA,EAAK6P,KAAN,CAGJ,IAAMmhB,EAAUhxB,EAAK6P,KACjBohB,EAAM,KAIVp0B,KAAK2zB,MAAQ,GAKb3zB,KAAKgT,KAAO,KAKZhT,KAAKq0B,OAAS,KAMdr0B,KAAKs0B,SAAW,GAGhBd,GADkBxzB,KAAKu0B,iBAAmB,GACdv0B,MAI5BA,KAAKw0B,SAAW,GAChB,IArKsBC,EAAY9F,EAqK5B+F,EAAmB10B,KAAK20B,yBAA2B,GArKnCF,EAsKNC,EAtKkB/F,EAsKA3uB,KArKpC0F,OAAOC,KAAK8uB,GAAY7sB,KAAI,SAAC1G,GACpB6tB,OAAAA,eAAeJ,EAAO6F,SAAUtzB,EAAK,CAC1CK,IAAK,WACH,IAAQwb,EAAe4R,EAAf5R,KAAM3H,EAASuZ,EAATvZ,KACd,OAAIA,EAAKlU,GACAkU,EAAKlU,GAELuzB,EAAWvzB,IAAQuzB,EAAWvzB,GAAK6b,IAAe,SA+J/D,IAAI6X,EAAY,GACZ,IACFA,EAAY50B,KAAK60B,eACVluB,GAEA,MADPvH,EAASqB,SAAQ,UAAAL,OAAWJ,KAAK8tB,WAAqBnnB,WAAAA,GAC/C,IAAImuB,MAAK10B,UAAAA,OAAWJ,KAAK8tB,WAAU,YAAA1tB,OAAWuG,EAAEnH,UAEzD,GAAIo1B,GACFR,EAAMJ,EAAOe,OAAOH,EAAWT,EAAShxB,EAAK/B,QACzC0E,aAAa,aAAc3C,EAAK/B,WACtC,CAAA,IAAW+B,EAAKowB,IAKd,QAJMzd,EAAAA,EAAK9Q,UAAU7B,EAAKowB,IAAK,GAAIpwB,EAAKkwB,KAAMlwB,EAAKuI,OAC/C5F,aAAa,aAAc3C,EAAK/B,OACpC+yB,EAAQlhB,YAAYmhB,GAKtBp0B,KAAKgT,KAAOohB,EACZp0B,KAAKq0B,OAASF,EAyBd,IAAMd,EAAOrzB,KAAKX,OAAOg0B,MAAQ,GAC3BrmB,EAAQhN,KAAKX,OAAO2N,OAAS,GAEnChN,KAAKg1B,QAAQ3B,GACbrzB,KAAKi1B,SAASjoB,GACVhN,KAAKX,OAAO+B,OACdpB,KAAKgT,KAAKlN,aAAa,aAAc9F,KAAKX,OAAO+B,OAEnDpB,KAAKk1B,wBAGP,CAAAh0B,IAAA,qBAAAC,MAGA,WAAsB,IAAAumB,EAAA1nB,KAChB,GAACA,KAAKgT,KAAN,CAMJhT,KAAKm1B,UAAY,GACXhvB,IAAAA,EAAWnG,KAAKmG,WAClBA,GAAgC,WAApBpE,EAAOoE,IACjBT,OAAOC,KAAKQ,GAAUvG,OAAS,GACjC8F,OAAOC,KAAKQ,GAAUyB,KAAI,SAAA/B,GACxB,IAMIxG,EAAQ20B,EANNtoB,EAAO7F,EACPuvB,EAAUjvB,EAASuF,GACnBvJ,EAAU,CACd6Q,KAAM0U,EAAK1U,MAIU,mBAAZoiB,GACA1N,EAAAA,EAAKroB,OAAOqM,IAAS,GACrB0pB,EAAAA,GACmB,WAAnBrzB,EAAOqzB,IAAkD,mBAAnBA,EAAQzG,SACvDtvB,EAAS+1B,EAAQjzB,QAAU2T,EAAKrL,SAAUid,EAAKroB,OAAOqM,IAAS,GAAK0pB,EAAQjzB,SAAYulB,EAAKroB,OAAOqM,IAAS,GAC7GsoB,EAASoB,EAAQzG,QAEnBxsB,EAAQ9C,OAASA,OACAgE,IAAjBhE,EAAO+B,QAAwBe,EAAQf,MAAQ/B,EAAO+B,OAC/C4R,EAAAA,OAAS7Q,EAAQ6Q,KAAO3T,EAAO2T,MACjCyd,EAAAA,eAAeuD,EAAQ7xB,EAASuJ,SAI5C,CAAAxK,IAAA,aAAAC,MAED,SAAY4b,GACLA,IACHA,EAAO/c,KAAK+c,MAWd,IAAQ/J,EAAyBhT,KAAzBgT,KAAMoC,EAAmBpV,KAAnBoV,KAAMof,EAAax0B,KAAbw0B,SAChBxhB,GAVKqiB,SAAAA,EAAe5pB,EAAMuF,GAC5B,IAAA,IAASrP,EAAI,EAAGA,EAAI8J,EAAKtF,SAASvG,OAAQ+B,IACpC8J,EAAKtF,SAASxE,GAAGwE,SAASvG,OAAS,EACvB6L,EAAAA,EAAKtF,SAASxE,GAAIqP,GAEvBvF,EAAAA,EAAKtF,SAASxE,IAMbqR,CAAAA,GAAM,SAACvH,GACnB,IAAM6pB,EAAU7pB,EAAK5E,cAAgB4E,EAAK5E,aAAa,YACvD,GAAKyuB,EAAL,CAGA,IAAMC,EAAengB,EAAKkgB,EAAQtN,gBAAkBwM,EAASc,GACzDC,IACF9pB,EAAKhG,UAAoC,mBAAjB8vB,EAA8BA,EAAaxY,GAAQwY,SAIlF,CAAAr0B,IAAA,OAAAK,IAED,WACE,OAAOvB,KAAK2U,OAAOoI,OACpB,CAAA7b,IAAA,oBAAAC,MAED,SAAmBkE,GAAKnE,IAAAA,EAAGvB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACtByV,EAAOpV,KAAKoV,MAAQ,GACpBof,EAAWx0B,KAAKw0B,SACtBnvB,EAAIS,cAAgBT,EAAIS,aAAa,WAAY5E,GACjD,IAAM0N,EAAOwG,EAAKlU,IAAQszB,EAAStzB,IAAQ,GACvC0N,IACFvJ,EAAII,UAAYmJ,KAEnB,CAAA1N,IAAA,UAAAC,MAED,WACE,OAAOnB,KAAKm1B,YAGd,CAAAj0B,IAAA,UAAAC,MAGA,WACEnB,KAAKX,OAAOm2B,SAAU,EACtB1f,EAAK1P,SAASpG,KAAKy1B,KAAK,kBAAmBxC,MAC5C,CAAA/xB,IAAA,SAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,EACtB1f,EAAK3O,YAAYnH,KAAKy1B,KAAK,kBAAmBxC,MAC/C,CAAA/xB,IAAA,WAAAC,MAED,WACE,MAAO,KACR,CAAAD,IAAA,iBAAAC,MAED,SAAgBwtB,GAAQxsB,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAI+L,EAAI/L,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACnCqT,EAAAA,KAAO7Q,EAAQ6Q,MAAQhT,KAAKgT,KACpC,IAAMuV,EAAEuC,EAAAC,EAAAiJ,EAAAztB,WAAA,iBAAAvG,MAAAyG,KAAwBkoB,KAAAA,EAAQxsB,EAASuJ,GAE1C6c,OADF4M,KAAAA,UAAUxtB,KAAK4gB,GACbA,IACR,CAAArnB,IAAA,gBAAAC,MAED,WACE,MAAO,KACR,CAAAD,IAAA,wBAAAC,MAED,WACE,MAAO,KAGT,CAAAD,IAAA,OAAAC,MAKA,SAAMu0B,GACA,GAAC11B,KAAKgT,KAGH,OAAAhT,KAAKgT,KAAKhL,cAAc0tB,KAGjC,CAAAx0B,IAAA,OAAAC,MAMA,SAAM6G,EAAe2tB,EAAW3kB,GAAU,IAAA2W,EAAA3nB,KACxC,GAAIL,UAAUC,OAAS,GAA0B,mBAAd+1B,EAC7B71B,MAAMsuB,QAAQpmB,GACFpC,EAAAA,SAAQ,SAACC,GAChB+vB,EAAAA,OAAO/vB,EAAM8vB,MAGfC,KAAAA,OAAO5tB,EAAe2tB,OAExB,CACCzmB,IAAAA,EAAM8kB,EAAO6B,SAASpvB,KAAKzG,KAAMA,KAAKgT,KAAMhL,EAAe2tB,EAAW3kB,GAC5EhR,KAAKk0B,YAAcl0B,KAAKk0B,YAAY9zB,OAAO8O,MAI/C,CAAAhO,IAAA,SAAAC,MAKA,SAAQ6G,EAAe2tB,GAAW,IAAA/N,EAAA5nB,KAChC,GAAIL,UAAUC,OAAS,GAA0B,mBAAd+1B,EAC7B71B,MAAMsuB,QAAQpmB,GACFpC,EAAAA,SAAQ,SAACC,GAChBiwB,EAAAA,SAASjwB,EAAM8vB,MAGjBG,KAAAA,SAAS9tB,EAAe2tB,QAI/B,IADA,IAAMz0B,KAAGd,OAAM4H,EAAa5H,KAAAA,OAAIu1B,GACvBh0B,EAAI,EAAGA,EAAI3B,KAAKk0B,YAAYt0B,OAAQ+B,IAC3C,GAAI3B,KAAKk0B,YAAYvyB,GAAGT,MAAQA,EAAK,CAC9BgzB,KAAAA,YAAYvyB,GAAGivB,UACfsD,KAAAA,YAAY7nB,OAAO1K,EAAG,GAC3B,SAMR,CAAAT,IAAA,WAAAC,MAMA,SAAUuK,EAAMvK,GAAO,IAAAgnB,EAAAnoB,KACjB,GAACA,KAAKgT,KAGV,MAA0B,WAAtB8C,EAAKpO,OAAOgE,GACN1L,KAAKgT,KAAKhG,MAAMtB,GAAQvK,OACD,WAAtB2U,EAAKpO,OAAOgE,IACrBhG,OAAOC,KAAK+F,GAAM9D,KAAI,SAAA1G,GACf8R,EAAAA,KAAKhG,MAAM9L,GAAOwK,EAAKxK,SAKlC,CAAAA,IAAA,UAAAC,MAMA,SAASuK,EAAMvK,GAAO,IAAAmnB,EAAAtoB,KAChB,GAACA,KAAKgT,KAGV,MAA0B,WAAtB8C,EAAKpO,OAAOgE,GACP1L,KAAKgT,KAAKlN,aAAa4F,EAAMvK,QACL,WAAtB2U,EAAKpO,OAAOgE,IACrBhG,OAAOC,KAAK+F,GAAM9D,KAAI,SAAA1G,GACpBonB,EAAKtV,KAAKlN,aAAa5E,EAAKwK,EAAKxK,UAKvC,CAAAA,IAAA,UAAAC,MAMA,SAAS40B,EAAS/kB,GACXhR,KAAKgT,OAGVhT,KAAKgT,KAAKvN,UAAYswB,EACE,mBAAb/kB,UAKb,CAAA9P,IAAA,SAAAC,MAOA,SAAQqI,EAAOwsB,GAAaC,IAAAA,EAAQt2B,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GAC7BK,KAAKgT,MAGN,KAAA5S,OAAKoJ,KAAWxJ,KAAKgT,MAA+B,mBAAhBgjB,GACtCh2B,KAAKgT,KAAKkV,iBAAiB1e,EAAOwsB,EAAaC,KAInD,CAAA/0B,IAAA,WAAAC,MAOA,SAAUqI,EAAOwsB,GAAaC,IAAAA,EAAQt2B,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GAC/BK,KAAKgT,MAGN,KAAA5S,OAAKoJ,KAAWxJ,KAAKgT,MAA+B,mBAAhBgjB,GACtCh2B,KAAKgT,KAAKoV,oBAAoB5e,EAAOwsB,EAAaC,KAItD,CAAA/0B,IAAA,OAAAC,MAKA,SAAMA,GACA,GAACnB,KAAKgT,KAMV,OAHAhT,KAAKgT,KAAKhG,MAAMsB,aAAoBjL,IAAVlC,EAAsBA,EAAQ,QAGhC,SAFbxC,OAAO2J,iBAAiBtI,KAAKgT,KAAM,MACnBkjB,iBAAiB,WAElCl2B,KAAKgT,KAAKhG,MAAMsB,QAAU,aADpC,IAGD,CAAApN,IAAA,OAAAC,MAED,WACEnB,KAAKgT,OAAShT,KAAKgT,KAAKhG,MAAMsB,QAAU,UAG1C,CAAApN,IAAA,cAAAC,MAMA,SAAag1B,EAAMC,GACb,IAACp2B,KAAKgT,KACD,OAAA,KAET,GAAIrT,UAAUC,OAAS,GAAKD,UAAU,aAAchB,OAAOqyB,QACzD,OAAOhxB,KAAKgT,KAAKC,YAAYtT,UAAU,IAEzC,KAAKy2B,GAAWA,aAAiBz3B,OAAOqyB,SAC/B,OAAA,KAEL,IACE,MAAgB,iBAATmF,EACFn2B,KAAKy1B,KAAKU,GAAMljB,YAAYmjB,GAE5BD,EAAKljB,YAAYmjB,SAEnB/vB,GAEA,OADE5F,EAAAA,SAAS,qBAAsB4F,GACjC,QAIX,CAAAnF,IAAA,SAAAC,MAIA,WACS,MAAA,KACR,CAAAD,IAAA,UAAAC,MAED,cAAa,CAAAD,IAAA,YAAAC,MAEb,WAAa,IAAA2nB,EAAA9oB,KACH2U,EAAW3U,KAAX2U,OACHuf,KAAAA,YAAYtsB,KAAI,SAAA/B,GACnBA,EAAK+qB,aAEP5wB,KAAKk0B,YAAc,GAEfl0B,KAAKm1B,qBAAqBr1B,QACvBq1B,KAAAA,UAAUvtB,KAAI,SAAA/B,GACVgrB,EAAAA,iBAAiBhrB,EAAKioB,eAE/B9tB,KAAKm1B,UAAY,MAEfn1B,KAAKgT,OAEHhT,KAAKgT,KAAKuG,eAAe,UAC3BvZ,KAAKgT,KAAK5L,SACDpH,KAAKgT,KAAK2e,YACnB3xB,KAAKgT,KAAK2e,WAAW9I,YAAY7oB,KAAKgT,OAI1C+X,EAAAA,EAAAiJ,EAAAztB,6BAAAE,KAAAzG,MACAA,KAAK2zB,MAAQ,GACb,CAAC,OAAQ,UAAU/rB,KAAI,SAAA/B,GACrBijB,EAAKjjB,GAAQ,QAEf7F,KAAKs0B,SAAW,MACjB,CAAA,CAAApzB,IAAA,SAAAC,MAnhBD,SAAe6E,EAAMquB,GAAQjzB,IAAAA,EAAKzB,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAC7BiC,EAAMyyB,EAAOluB,SAASvG,OACtBy2B,EAAYC,OAAOl1B,GACnBm1B,EAAevwB,aAAgBrH,OAAOiM,KAE5C,GAAIhJ,EAAK,CAIDD,IAHN,IAAIA,EAAI,EACJ60B,EAAa,KACbC,EAAO,GACL90B,EAAIC,EAAKD,IAAK,CAClB60B,EAAanC,EAAOluB,SAASxE,GAC7B,IAAM+0B,EAASJ,OAAOE,EAAW3vB,aAAa,eAC9C,GAAI6vB,GAAUL,EAAW,CAChBI,EAAA,cACP,MACSC,EAASL,IACXI,EAAA,YAcJA,OAVHF,EACW,aAATE,EAEFpC,EAAOphB,YAAYjN,GAEZ2wB,EAAAA,aAAa3wB,EAAMwwB,GAGjBI,EAAAA,mBAAmBH,EAAMzwB,GAEtB,aAATywB,EAAsBpC,EAAOluB,SAASkuB,EAAOluB,SAASvG,OAAS,GAAKy0B,EAAOluB,SAASxE,GAG3F,OADA40B,EAAelC,EAAOphB,YAAYjN,GAAQquB,EAAOuC,mBAAmB,YAAa5wB,GAC1EquB,EAAOluB,SAASkuB,EAAOluB,SAASvG,OAAS,KAEnD,CAAAsB,IAAA,gBAAAK,IAED,WACE,MAAO,KAGT,CAAAL,IAAA,WAAAC,MASA,SAAiB6R,EAAMhL,EAAe2tB,EAAW3kB,GAAU6lB,IAAAA,EAAOl3B,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GAC1Dm3B,EAAO,GACb,GAAI9jB,aAAgBrU,OAAOiM,MAA4B,mBAAboG,EACpClR,GAAAA,MAAMsuB,QAAQuH,GACN/vB,EAAAA,SAAQ,SAACC,GACjB,IAAMqJ,EAAM2mB,GAAS7iB,EAAMhL,EAAenC,EAAMmL,EAAU6lB,GAC1D3nB,EAAIhO,IAAG,GAAAd,OAAM4H,EAAa5H,KAAAA,OAAIyF,GAC9BixB,EAAKnvB,KAAKuH,UAEP,CACL,IAAMA,EAAM2mB,GAAS7iB,EAAMhL,EAAe2tB,EAAW3kB,EAAU6lB,GAC/D3nB,EAAIhO,IAAG,GAAAd,OAAM4H,EAAa5H,KAAAA,OAAIu1B,GAC9BmB,EAAKnvB,KAAKuH,GAGP4nB,OAAAA,IACR,CAAA51B,IAAA,aAAAK,IAID,WACS+wB,OAAAA,KACR,CAAApxB,IAAA,YAAAK,IAED,WACSkxB,OAAAA,OACRuB,GApFkBzE,IAAfyE,EAAAA,GAAM,UA4EO7B,IC/NnB,IAGM4E,GAAc,WAClB,SAAAA,IAAe,IAAA3Q,EAAApmB,KAIT,GAJSgB,OAAA+1B,GAAA9O,EAAAjoB,KAAA,aAyEH,SAACg3B,GACX,IAAMC,GAAI,IAAInzB,MAAOsO,UACrBgU,EAAKhB,UAAY6R,EACjB,IAAA,IAASt1B,EAAI,EAAGA,EAAIq1B,EAAQp3B,OAAQ+B,IAC7Bu1B,EAAAA,aAAaF,EAAQr1B,GAAGqI,WA5E/BhK,KAAKm3B,WAAa,GAClBn3B,KAAKolB,UAAY,EACjBplB,KAAKo3B,SAAW,KACXz4B,OAAOo4B,eAGR,IACF/2B,KAAKo3B,SAAW,IAAIz4B,OAAOo4B,eAAehyB,EAAS/E,KAAKq3B,UAAW,IAAK,CAAEx0B,UAAU,KACpF7C,KAAKolB,WAAY,IAAIthB,MAAOsO,gBACrBzL,GACP1G,QAAQhB,MAAM0H,IA4DjBowB,OA1DA91B,EAAA81B,EAAA,CAAA,CAAA71B,IAAA,cAAAC,MAED,SAAa6I,EAAQqjB,GACf,GAACrtB,KAAKo3B,SAAN,CAGCA,KAAAA,SAASE,QAAQttB,GAItB,IAHMutB,IAAAA,EAAOvtB,EAAOnD,aAAasmB,IACzBgK,EAAen3B,KAAfm3B,WACJ/1B,GAAQ,EACHO,EAAI,EAAGA,EAAIw1B,EAAWv3B,OAAQ+B,IACjCw1B,EAAWx1B,IAAMqI,IAAWmtB,EAAWx1B,GAAGqI,SAC5C5I,EAAQO,GAGRP,GAAY,EACT+1B,KAAAA,WAAW/1B,GAAOisB,QAAUA,EAEjCrtB,KAAKm3B,WAAWxvB,KAAK,CACnBqC,OAAAA,EACAqjB,QAAAA,EACAjR,SAAUmb,OAGf,CAAAr2B,IAAA,aAAAC,MAED,SAAY6I,GACV,IAAIrI,GAAI,EACR3B,KAAKm3B,WAAWvvB,KAAI,SAAC/B,EAAMzE,GACrB4I,IAAWnE,EAAKmE,SACd5I,EAAAA,MAGJ,IAAAo2B,IAAAA,EACWA,QAAbA,EAAAx3B,KAAKo3B,gBAALI,IAAaA,GAAbA,EAAeC,UAAUztB,SAClBrD,IACThF,GAAU,GAAA3B,KAAKm3B,WAAW9qB,OAAO1K,EAAG,KACrC,CAAAT,IAAA,kBAAAC,MAED,WAAmBu2B,IAAAA,EACJ,QAAbA,EAAI13B,KAACo3B,gBAAQ,IAAAM,GAAbA,EAAeC,aACf33B,KAAKo3B,SAAW,KAChBp3B,KAAKm3B,WAAa,OACnB,CAAAj2B,IAAA,eAAAC,MAED,SAAc6I,GAEZ,IADA,IAAQmtB,EAAen3B,KAAfm3B,WACCx1B,EAAI,EAAGA,EAAIw1B,EAAWv3B,OAAQ+B,IACrC,GAAIw1B,EAAWx1B,IAAMqI,IAAWmtB,EAAWx1B,GAAGqI,OAAQ,CAChD,IACSrI,EAAAA,GAAG0rB,QAAQrjB,SACf/K,GACPgB,QAAQhB,MAAMA,GAET,OAAA,EAGJ,OAAA,MACR83B,EAxEiB,GAsFhBa,GAAiB,KCpFrB,IAAMC,GAAiB,CACrBC,YAAa,GACbjX,KAAI,SAAClM,GAEH,IDkFkB3K,EAAQqjB,EClFtB0K,EAAOpjB,EAAOqjB,cACbD,IACIA,GAAA,IAAIj0B,MAAOsO,UAClBuC,EAAOqjB,cAAgBD,IAGxBpjB,EAAOtV,OAAO44B,sBD4EGjuB,EC3EJ2K,EAAO3B,KD2EKqa,EC3EC,WACvB1Y,EAAOujB,UD2ERN,KACHA,GAAiB,IAAIb,IAGRoB,GAAAA,YAAYnuB,EAAQqjB,IC5EjCrtB,KAAK83B,YAAYC,GAAQ,CACvBK,iBAAkBzjB,EAAOtV,QAAU,GACnCg5B,SAAU,KAIdC,iBAAgBA,SAAC3J,EAAQtvB,GACvB,IAAIk5B,EAAU,KACVp2B,EAAU,KAYP,OAXHwsB,EAAOA,QAAmC,mBAAlBA,EAAOA,QACjC4J,EAAU5J,EAAOA,OACjBxsB,EAAUwsB,EAAOxsB,UAEPwsB,EAAAA,EACVxsB,EAAU,IAER9C,IACMA,EAAAA,OAASA,GAAU,IAGtB,CACLk5B,QAAAA,EACAp2B,QAAAA,IAUJq2B,mBAAkBA,SAAC1K,EAAYY,GAC7B,IAAA,IAAS/sB,EAAI,EAAGA,EAAI+sB,EAAQ9uB,OAAQ+B,IAClC,GAAImsB,EAAWpM,gBAAkBgN,EAAQ/sB,GAAGmsB,WAAWpM,cAC9C,OAAA,EAGJ,OAAA,GAST+W,gBAAeA,SAAC3K,EAAY8B,GAG1B,IAFMjqB,IAAAA,EAAOD,OAAOC,KAAKiqB,GACrB8I,EAAW,KACN/2B,EAAI,EAAGA,EAAIgE,EAAK/F,OAAQ+B,IAC/B,GAAImsB,EAAWpM,gBAAkB/b,EAAKhE,GAAG+f,cAAe,CACtDgX,EAAW9I,EAAajqB,EAAKhE,IAC7B,MAIJ,MAA8B,WAA1BmU,EAAKpO,OAAOgxB,GACP,CACL1lB,KAAM0lB,EAAS1lB,KACf2lB,SAAUD,EAASC,UAGhB,IASTC,aAAYA,SAACjkB,EAAQkkB,GAAY,IAAAzS,EAAApmB,KACzBke,EAAU2a,EAAW3a,SAAW,KAC/BgG,OAAAA,QAAQ4U,KAAK,CAClBD,EAAWE,SAASxL,MAAK,SAACoB,GACpBpsB,IAAAA,EAEFA,EADEosB,MAAAA,GAAAA,EAAQqK,WACDrK,EAAOsK,QAEPtK,EAEXvI,EAAK8S,SAASvkB,EAAQpS,EAAQosB,EAAOxsB,YAEvC,IAAI+hB,SAAQ,SAACiV,EAAGC,GACd31B,YAAW,WACF21B,EAAA,IAAItE,MAAM,cAChB5W,SAWTgb,SAAQA,SAACvkB,EAAQga,GAAQxsB,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAE/B,GAACgV,GACAga,GACiB,mBAAXA,QACctrB,IAArBsrB,EAAOpoB,UAHP,CAOF,IAAMwxB,EAAOpjB,EAAOqjB,cACpB,GAAKD,GAAS/3B,KAAK83B,YAAYC,GAA/B,CAGK/3B,KAAK83B,YAAYC,GAAMM,WACrBP,KAAAA,YAAYC,GAAMM,SAAW,IAE9B3J,IAAAA,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACjCgB,EAAkBr5B,KAAK83B,YAAYC,GAAMK,iBAC/Cj2B,EAAQwS,OAASA,EAEXmZ,IAAAA,EAAa3rB,EAAQ2rB,YAAca,EAAOb,WAChD,IAAKA,EACG,MAAA,IAAIgH,MAAM,wCAIhBnG,IAAAA,EAAO2K,aACN3K,EAAO2K,YAAY3kB,EAAOtV,OAAO0nB,UAAWpS,EAAOtV,OAAOk6B,WAD3D5K,CAOGxsB,EAAQ9C,SACX8C,EAAQ9C,OAAS,IAKnB,IADMsG,IAAAA,EAAOD,OAAOC,KAAK0zB,GAChB13B,EAAI,EAAGA,EAAIgE,EAAK/F,OAAQ+B,IAC/B,GAAImsB,EAAWpM,gBAAkB/b,EAAKhE,GAAG+f,cAAe,CAChDriB,IAAAA,EAASg6B,EAAgB1zB,EAAKhE,IACR,WAAxBmU,EAAKpO,OAAOrI,GACNA,EAAAA,OAASqG,OAAO6gB,OAAO,GAAIpkB,EAAQ9C,OAAQg6B,EAAgB1zB,EAAKhE,KACvC,YAAxBmU,EAAKpO,OAAOrI,KACbA,EAAAA,OAAOm2B,SAAWn2B,GAE5B,MAKAsvB,EAAO6K,eACT9zB,OAAOC,KAAKgpB,EAAO6K,eAAe5zB,SAAQ,SAAC1E,QACN,IAAxBiB,EAAQ9C,OAAO6B,KAChB7B,EAAAA,OAAO6B,GAAOytB,EAAO6K,cAAct4B,OAM5CiB,EAAQ6Q,KAEsB,iBAAjB7Q,EAAQ6Q,OAChBA,EAAAA,KAAO2B,EAAOxS,EAAQ6Q,OAF9B7Q,EAAQ6Q,KAAO2B,EAAO3B,KAKhB5R,EAAAA,MAAQe,EAAQ9C,OAAO+B,OAAS,EACpC,IAEEstB,EAAQZ,EAAWpM,iBACrB1hB,KAAKy5B,WAAW1B,EAAMjK,EAAWpM,eACjCzhB,QAAQf,KAAI,2CAAAkB,OACiC0tB,yCAIzC4L,IAAAA,EAAY,IAAI/K,EAAOxsB,GAMtBu3B,OALC5L,EAAAA,EAAWpM,eAAiBgY,EAC5B5L,EAAAA,EAAWpM,eAAezf,KAAO0sB,EACrC+K,GAA8C,mBAA1BA,EAAUC,aAChCD,EAAUC,cAELD,QACArzB,GAEDA,MADNpG,QAAQhB,MAAMoH,GACRA,QAzDNpG,QAAQf,KAAI,yBAAAkB,OAA0B0tB,WAkE1C2L,WAAUA,SAAC1B,EAAMrsB,GACXqsB,EAAKC,gBACPD,EAAOA,EAAKC,eAEdtsB,EAAOA,EAAKgW,cACR,IACF,IAAMiN,EAAS3uB,KAAK83B,YAAYC,GAAMM,SAAS3sB,GAC3CijB,IACKb,EAAAA,YAAca,EAAOiL,mBACrB55B,KAAK83B,YAAYC,GAAMM,SAAS3sB,UAElC/E,GACC1H,QAAAA,MAAKmB,eAAAA,OAAgBsL,EAAItL,YAAAA,OAAW23B,EAAepxB,WAAAA,KAS/DkzB,aAAYA,SAACllB,EAAQjJ,GACnB,IAAMqsB,EAAOpjB,EAAOqjB,cAChBD,GAAQ/3B,KAAK83B,YAAYC,IAAS/3B,KAAK83B,YAAYC,GAAMM,iBACpDr4B,KAAK83B,YAAYC,GAAMM,SAAS3sB,IAQ3CouB,WAAU,SAACnlB,GACT,IAAMojB,EAAOpjB,EAAOqjB,cACbD,OAAAA,GAAQ/3B,KAAK83B,YAAYC,GAAQ/3B,KAAK83B,YAAYC,GAAMM,SAAW,IAG5E0B,WAAUA,SAACplB,EAAQqlB,GACjB,IAAMjC,EAAOpjB,EAAOqjB,cACpB,IAAKD,IAAS/3B,KAAK83B,YAAYC,GACtB,OAAA,KAIL,GAAqB,iBAAdiC,EAAwB,CAC3BC,IAAAA,EAAQD,EAAUtY,cACxB,OAAO1hB,KAAK83B,YAAYC,GAAMM,SAAS4B,IAAU,KACnD,GAAgC,mBAAdD,EAA0B,CAEpCtL,IAAAA,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACvC,IAAA,IAAWn3B,KAAOwtB,EACZsL,GAAAA,EAAUtL,EAAQxtB,IACpB,OAAOwtB,EAAQxtB,IAAQ,KAItB,OAAA,MAGTg5B,WAAU,SAACvlB,GAAQ,IAAA+S,EAAA1nB,KACjB,SAASm6B,EAAWhuB,GAClB,OAAKA,GAAQA,EAAIohB,KAKRphB,EAJA,IAAI+X,SAAQ,SAACC,UAOjB,OAAA,IAAID,SAAQ,SAACC,GAAYiW,IAAAA,EAC1B,GAAC1S,EAAKoQ,YAWHuC,OANmBD,QAA1BA,EAAIzlB,EAAO2lB,uBAAPF,IAAsBA,GAAtBA,EAAwBx6B,OACfskB,QAAQqW,IAAI5lB,EAAO2lB,iBAEnBpW,QAAQC,WAGLoJ,MAAK,WACnB,IAAMwK,EAAOpjB,EAAOqjB,cAChB,GAACtQ,EAAKoQ,YAAYC,GAAlB,CAIErJ,IAAAA,EAAUhH,EAAKoQ,YAAYC,GAAMM,SACjCmC,EAAa,GACnB90B,OAAOC,KAAK+oB,GAAS9oB,SAAQ,SAAC60B,GAAUC,IAAAA,EACtC,GAAkBA,QAAlBA,EAAIhM,EAAQ+L,UAARC,IAAcA,GAAdA,EAAgBC,iBACd,IACIzrB,IAAAA,EAAMwf,EAAQ+L,GAAOE,mBAChBhzB,EAAAA,KAAKwyB,EAAWjrB,UACpBvI,GAEDA,MADKgB,EAAAA,KAAKwyB,EAAW,OACrBxzB,MAKJ4zB,QAAAA,IAAG,GAAAn6B,OAAKo6B,IACbjN,MAAK,kBAGLW,OAAM,SAACvnB,GACN1G,QAAQhB,MAAM0H,0BAOxBi0B,UAAS,SAACjmB,GACR,IAAMojB,EAAOpjB,EAAOqjB,cACpB,GAAKD,GAAS/3B,KAAK83B,YAAYC,GAA/B,CAGMrJ,IAAAA,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACvC3yB,OAAOC,KAAK+oB,GAAS9oB,SAAQ,SAAC60B,GAAUI,IAAAA,EACpBA,QAAlBA,EAAInM,EAAQ+L,UAARI,IAAcA,GAAdA,EAAgBC,iBAClBpM,EAAQ+L,GAAOK,uBAKrBC,QAAOA,SAAChe,EAAMpI,GACZ,IAAMojB,EAAOpjB,EAAOqjB,cACpB,GAAKD,GAAS/3B,KAAK83B,YAAYC,GAA/B,CAGMrJ,IAAAA,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACvC3yB,OAAOC,KAAK+oB,GAAS9oB,SAAQ,SAACC,GACxB6oB,GAAAA,EAAQ7oB,GAAMm1B,WACRn1B,EAAAA,GAAMm1B,WAAWje,QAGrB,IACF2R,EAAQ7oB,GAAMkX,KAAOA,QACd9d,GACPgB,QAAQf,KAAI,GAAAkB,OAAIyF,qBAMxBo1B,SAAQ,SAACtmB,GAAQ,IAAAgT,EAAA3nB,KACT+3B,EAAOpjB,EAAOqjB,cAEpB,GAAKD,GAAS/3B,KAAK83B,YAAYC,GAA/B,CAGA,IAAMmD,EAAS,GACTxM,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACvC3yB,OAAOC,KAAK+oB,GAAS9oB,SAAQ,SAAC60B,GACd,aAAVA,GAAwB/L,EAAQ+L,KAClCS,EAAOvzB,KAAK,CACVgnB,OAAQD,EAAQ+L,GAAOx4B,KACvBE,QAASusB,EAAQ+L,GAAOhL,SAErBgK,EAAAA,WAAW1B,EAAM0C,OAGnB70B,EAAAA,SAAQ,SAACC,GACd8hB,EAAKuR,SAASvkB,EAAQ9O,EAAK8oB,OAAQ9oB,EAAK1D,cAI5Cg5B,eAAc,SAACxmB,GACb,IAAMojB,EAAOpjB,EAAOqjB,cACpB,GAAKD,GAAS/3B,KAAK83B,YAAYC,GAA/B,CAGA,IAAMrJ,EAAU1uB,KAAK83B,YAAYC,GAAMM,UAAY,GACnD3yB,OAAOC,KAAK+oB,GAAS9oB,SAAQ,SAAC1E,GAE1BwtB,EAAQxtB,GAAKi6B,gBAC0B,mBAAhCzM,EAAQxtB,GAAKi6B,gBAEpBzM,EAAQxtB,GAAKi6B,sBAKnBvK,QAAO,SAACjc,GACN,IAAMojB,EAAOpjB,EAAOqjB,cAChB,GAACh4B,KAAK83B,YAAYC,GAAlB,CD3SCqD,IAAYpxB,EAAQqjB,EAASgO,EAAjBrxB,EC8SN2K,EAAO3B,KD7SN,QAAdqoB,EAAAzD,UAAc,IAAAyD,GAAdA,EAAgBD,WAAWpxB,EAAQqjB,GC+SjCiO,IADM5M,IAAAA,EAAU1uB,KAAK83B,YAAYC,GAAMM,SACvCiD,EAAAC,EAAAA,EAAmB71B,OAAOC,KAAK+oB,GAAQ4M,EAAAC,EAAA37B,OAAA07B,IAAE,CAApC,IAAMz1B,EAAI01B,EAAAD,GACR7B,KAAAA,WAAW1B,EAAMlyB,UAEjB7F,KAAK83B,YAAYC,UACjBpjB,EAAOqjB,iBC1ZHwD,GAAA,CACbC,QAAS,WACTC,aAAc,wBACdC,MAAO,oBACPC,OAAQ,iBACR1lB,QAAS,mBACTC,MAAO,iBACPO,QAAS,mBACTqB,QAAS,qBACT1B,MAAO,oBACPoB,OAAQ,kBACRokB,SAAU,mBACVC,OAAQ,kBACRC,SAAU,oBACVC,WAAY,yBACZC,eAAgB,4BAChBC,kBAAmB,6BACnBC,yBAA0B,yBAC1BC,kBAAmB,6BACnBC,iBAAkB,4BAClBC,YAAa,cACbC,cAAe,gBACfC,gBAAiB,kBACjBC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,mBAAoB,qBACpBrmB,QAAS,UACTsmB,GAAI,cACJC,OAAQ,kBACRC,KAAM,iBCiFO,SAASC,KACf,MAAA,CACLr4B,GAAI,GACJO,GAAI,KACJgG,IAAK,GACLglB,aAAc,UACd+M,cAAc,EACdtwB,MAAO,IACPC,OAAQ,MACRswB,OAAO,EACPC,aAAc,QACdC,cAAe,OACf1X,OAAQ,GACRgB,UAAU,EACVY,eAAe,EACfD,MAAM,EACNgW,QAAQ,EACRvsB,KAAM,EACNwsB,WAAW,EACXC,OAAQ,GACRC,sBAAsB,EACtBhW,oBAAqB,EACrBiW,sBAAuB,KACvBC,qBAAqB,EACrBC,mBAAmB,EACnBC,iBAAiB,EACjBC,oBAAoB,EACpBC,iBAAiB,EACjBC,gBAAgB,EAChBC,gBAAiB,IACjBC,qBAAqB,EACrBC,sBAAsB,EACtBC,sBAAsB,EACtBC,mBAAmB,EACnBC,gBAAgB,EAChBpX,gBAAiB,GACjBqX,UAAW,EACXC,aAAc,OACdC,cAAc,EACdC,oBAAqB,aAErBC,mBAAoB,aAEpBC,cAAe,KACfC,QAAS,GACTC,UAAW,GACXC,SAAU,IACV9hB,MpB+8BEA,GAAQzX,SAASuK,gBAAgBhJ,aAAa,SAAW0a,UAAUud,UAAY,SAAS5b,oBAC/E,UAATnG,IACKA,EAAA,MAEFA,GoBl9BLyJ,UAAU,EACVuY,gBAAgB,EAChBC,iBAAkB,KAClBC,YAAY,EACZ5rB,QAAQ,EACR6rB,KAAK,EACLC,UAAU,EACVC,MAAM,EACNC,eAAe,EACfC,aAAa,EACbC,QAAS,GACT7Q,QAAS,GACT5I,aAAc,EACd0Z,WAAY,CAAE99B,KAAM,IACpBglB,aAAa,EACb+Y,eAAgB,EAChBC,WAAY,EACZ/L,MAAO,GACPve,KAAM,GACN0R,SAAU,EACV6Y,UAAW,KACXrb,YAAa,GACbsb,YAAY,EACZC,aAAc,IACdC,YAAa,CACXC,cAAe,GACfC,YAAa,GACbC,YAAa,GACbC,eAAgB,GAChBC,YAAa,KpBg7BnB,IACMpjB,EqB5mCC,ICAMqjB,GACF,EADEA,GAEJ,EAFIA,GAGA,EAHAA,GAID,EAJCA,GAKD,EALCA,GAMF,EANEA,GAOJ,EAIIC,GAAc,CACzB,QACA,UACA,QACA,YACA,WACA,WACA,UACA,QACA,aCPIC,YAAQC,GAAAtkB,EAAAqkB,EAAAC,GAAArkB,IAAAA,EAAAC,EAAAmkB,GAAA,SAAAA,IAAAla,IAAAA,EAAAplB,OAAAs/B,GAAA,IAAA,IAAA5gC,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAgFXqmB,OAhFW6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAwEG,gBAAA,SAACwD,GACd85B,IAAAA,EAAAD,EAAApa,GAAQzR,EAAM8rB,EAAN9rB,OAAoB8rB,EAAZ7Q,aACHuO,mBAAqBxpB,EAAO+rB,MAAM,CAAEC,UAAU,OAC5D1Y,EAAAuY,EAAApa,GAEc,gBAAA,SAACzf,GACd65B,EAAApa,GAAQzR,OACD+rB,WACRta,EAjEAka,OAiEAr/B,EAAAq/B,EAAA,CAAA,CAAAp/B,IAAA,eAAAC,MA/DD,SAAcgC,GACPA,EAAK9D,OAAOo3B,MAA2B,WAAnBtP,GAAQhG,SAC/Bhe,EAAK9D,OAAOo3B,KAAO,QAEjBtzB,EAAKwR,OAAOtV,OAAO0/B,iBACrB57B,EAAK9D,OAAOshC,UAAW,KAE1B,CAAAz/B,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACb4gC,EAAkC5gC,KAAKX,OAA/Bm2B,EAAOoL,EAAPpL,QAAS7oB,EAAMi0B,EAANj0B,OAAQ8pB,EAAImK,EAAJnK,KACzB,IAAIjB,EAAJ,CAIS,SAATiB,GAAmBz2B,KAAK2U,OAAOvO,SAASo1B,GAAYe,eACpD,IAAMvvB,EAAQ,CACZL,OAAM,GAAAvM,OAAKuM,EAAM,OAEnBjH,OAAOC,KAAKqH,GAAOpF,KAAI,SAAA1G,GAChB8R,EAAAA,KAAKhG,MAAM9L,GAAO8L,EAAM9L,MAM1B2/B,KAAAA,KAAO7gC,KAAKy1B,KAAK,gBAKjBqL,KAAAA,OAAS9gC,KAAKy1B,KAAK,kBAKnBsL,KAAAA,MAAQ/gC,KAAKy1B,KAAK,iBAKlBuL,KAAAA,UAAYhhC,KAAKy1B,KAAK,qBAGtBla,KAAAA,GAAG9B,IAA0B,SAACwnB,GACxBnrB,EAAAA,EAAK1P,SAASshB,EAAK1U,KAAM,iBAAmB8C,EAAK3O,YAAYugB,EAAK1U,KAAM,oBAG3EuqB,IAAAA,EAAyBv9B,KAAK4vB,aAA9B2N,qBACe,WAAnBpW,GAAQhG,QAAgD,WAAzBoc,IAC5BtxB,KAAAA,KAAK,aAAcjM,KAAKkhC,cACxBj1B,KAAAA,KAAK,aAAcjM,KAAKmhC,kBAEhC,CAAAjgC,IAAA,QAAAC,MAYD,WACEnB,KAAK2U,OAAO+rB,MAAM,CAAEC,UAAU,MAC/B,CAAAz/B,IAAA,cAAAC,MAED,WACEnB,KAAK2U,OAAO+rB,MAAM,CAAEC,UAAU,MAC/B,CAAAz/B,IAAA,OAAAC,MAED,WACEnB,KAAK2U,OAAOysB,KAAK,CAAEC,cAAc,MAClC,CAAAngC,IAAA,kBAAAC,MAED,WAEEnB,KAAKX,OAAOshC,UAAY7qB,EAAK1P,SAASpG,KAAKgT,KAAMwoB,GAAYiB,qBAC9D,CAAAv7B,IAAA,gBAAAC,MAED,WAEE2U,EAAK3O,YAAYnH,KAAKgT,KAAMwoB,GAAYiB,qBAG1C,CAAAv7B,IAAA,OAAAC,MAIA,SAAMA,GACC6R,KAAAA,KAAKhG,MAAMsB,QAAU,GAC1BtO,KAAK2U,OAAO+rB,UACb,CAAAx/B,IAAA,OAAAC,MAED,WACO6R,KAAAA,KAAKhG,MAAMsB,QAAU,SAG5B,CAAApN,IAAA,OAAAK,IAGA,WACE,OAAOvB,KAAKX,OAAOo3B,OAGrB,CAAAv1B,IAAA,iBAAAC,MAOA,SAAgBwtB,GAAQxsB,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAI+L,EAAI/L,UAAAC,OAAAD,EAAAA,kBAAA0D,EACpC,GAACrD,KAAKgT,KAAN,CAGEwmB,IAAAA,EAAgB7K,EAAO6K,eAAiB,GAC1C,IAACr3B,EAAQ6Q,KAAM,CACjB,IAAM2lB,EAAWx2B,EAAQw2B,SAAWx2B,EAAQw2B,SAAWx2B,EAAQ9C,QAAU8C,EAAQ9C,OAAOs5B,SAAWx2B,EAAQ9C,OAAOs5B,SAAWa,EAAcb,SACnIA,OAAAA,GAAAA,KACDlG,GAAUI,cACb1wB,EAAQ6Q,KAAOhT,KAAK6gC,KACpB,MAAA,KACGpO,GAAUM,eACb5wB,EAAQ6Q,KAAOhT,KAAK+gC,MACpB,MAAA,KACGtO,GAAUO,gBACb7wB,EAAQ6Q,KAAOhT,KAAK8gC,OACpB,MAAA,KACGrO,GAAUF,SACbpwB,EAAQ6Q,KAAOhT,KAAKgT,KACpB,MAAA,QAEA7Q,EAAQ6Q,KAAOhT,KAAK6gC,KAExB,OAAA/V,EAAAC,EAAAuV,EAAA/5B,WAAAE,iBAAAA,MAAAA,KAA4BkoB,KAAAA,EAAQxsB,EAASuJ,OAEhD,CAAAxK,IAAA,UAAAC,MAED,WACyB,WAAnBgmB,GAAQhG,SACLmgB,KAAAA,OAAO,aAActhC,KAAKkhC,cAC1BI,KAAAA,OAAO,aAActhC,KAAKmhC,eAEjCnhC,KAAK6gC,KAAO,KACZ7gC,KAAK8gC,OAAS,KACd9gC,KAAK+gC,MAAQ,KACb/gC,KAAKghC,UAAY,OAClB,CAAA9/B,IAAA,SAAAC,MAED,WACE,IAAAogC,EAA8CvhC,KAAKX,OAA3Co3B,EAAI8K,EAAJ9K,KAAMkK,EAAQY,EAARZ,SAAUa,EAAQD,EAARC,SACxB,IADyCD,EAAP/L,QAClC,CAKMhwB,IAAAA,EAAYsQ,EAAKvO,WACrB,CAAE,qBAAqB,GACvB,CAAE,gBAA0B,SAATkvB,GACnB,CAAE,kBAA4B,WAATA,GAAmBxO,EACrCuT,GAAAA,GAAYiB,kBAAoBkE,GACnC,CAAE,6BAA8Ba,IAAab,IAC/CvgC,MAAAA,uBAAAA,OAA8BoF,EAAS,2UASxC,CAAA,CAAAtE,IAAA,aAAAK,IA9LD,WACS,MAAA,aAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLi0B,SAAS,EACTmL,UAAU,EACVlK,KAAM,GACN+K,UAAU,OAEblB,GAfoBtM,IC0BjByN,GAAe,CAAC,OAAQ,QAAS,SAAU,SAC7CC,GAAkB,EAClBC,GAAY,EAEZC,GAAc,KAEZC,YAAMC,GAAA7lB,EAAA4lB,EAAAC,GAAA5lB,IAAAA,EAAAC,EAAA0lB,GAoDV,SAAAA,EAAa1/B,GAAS,IAAA4/B,EAAAra,EAAAtB,EAAAplB,OAAA6gC,GACpB,I1BjEgBltB,E0BiEVtV,EAASyW,EAAKjL,UAAUkyB,KAAoB56B,GACrC8lB,EAAAuY,EAAbtkB,EAAAA,EAAAzV,UAAMpH,mBA6nDM,WACR,GAAC+mB,EAAK/mB,OAAN,CAGJ,IAAAuhC,EAA0Cxa,EAAK/mB,OAAvConB,EAAQma,EAARna,SAAUc,EAAmBqZ,EAAnBrZ,oBAElBnoB,EAASG,QAAQ,SAAU,yBAA0B6mB,EAAK4b,aAC1D5b,EAAK6b,mBAGL7b,EAAKN,aAAeyB,GAEnBd,GAAYL,EAAK8b,eAAiB9b,EAAK+b,YACnC1mB,EAAAA,IAAIhC,EAAgB2M,EAAKgc,aACzBj7B,EAAAA,YAAYq0B,GAAYG,WAG/B1T,EAAAuY,EAAApa,yBAGqB,SAAC5c,EAAO64B,GACrBC,IAAAA,EAAc,WAClBxsB,EAAKrS,WAAU+8B,EAAApa,IAAO,WACpBA,EAAK8R,WACJ,MAECqK,EAASzsB,EAAKhI,kBAChBsY,EAAKoc,gBACPpc,EAAKoc,gBAAkB,GAGvBpc,EAAKrL,KAAKtB,GAAoB,CAC5Bkc,UAAW,SACXvF,OAAQ,oBACRtC,WAAY,SACZ5Z,YAAakS,EAAKlS,YAClBrB,SAAUuT,EAAKvT,SACf4vB,MAAO,CAAC,CACNC,KAAM,aACNC,MAAM,EACNC,IAAI,MAIV,IAAMC,ExBzpBDC,SAAqBrR,EAASrV,EAAUlb,GAC/C,GAAKuwB,EAAL,CAGMsR,IAAAA,EAAMtR,EAAQ5qB,aAAa3F,GAC7B6hC,SAAAA,GAAOA,IAAQ3mB,GAAiC,UAApBqV,EAAQlmB,SAA2C,UAApBkmB,EAAQlmB,UwBopBrDu3B,CAAoBP,EAAQnc,EAAKhK,SAAU+Q,IAC3D,GAAIkV,GAAiBE,IAAWA,IAAWnc,EAAK4c,eAAiBH,QAE9Dzc,EAAK/mB,OAAO6+B,sBAAwB9X,EAAKvU,MAAM6uB,QAChDta,EAAK6c,YAAa,EAElB7c,EAAK8c,gBAAgB9c,EAAKpT,KAAMuvB,EAAQ/G,GAAYQ,YACpD5V,EAAKrL,KAAKtB,IAA0B,EAAM2M,EAAK+c,mBAC3C/c,EAAKgd,eACPhd,EAAKid,yBAET,GAAWjd,EAAK6c,WAAY,KAE1BxC,IAAAA,EAAAD,EAAApa,GAAQ+c,EAAiB1C,EAAjB0C,kBAcJ,GAd6B1C,EAANphC,OAChBikC,sBAET3kC,OAAO4kC,SAASJ,EAAkBtC,KAAMsC,EAAkBK,KAC1D1tB,EAAKrS,WAAU+8B,EAAApa,IAAQ,WACrBA,EAAK6c,YAAa,EAClB7c,EAAK+c,kBAAoB,OACxB,QAGF/c,EAAK/mB,OAAO6+B,sBAAwB9X,EAAKvU,MAAM6uB,QAChDta,EAAK6c,YAAa,EAClB7c,EAAK+c,kBAAoB,MAEtB/c,EAAKgd,cAOHj8B,EAAAA,YAAYq0B,GAAYQ,gBAPN,CACvB,IAAI/2B,EAAKmhB,EAAK4c,cACT/9B,IAAOmhB,EAAKpT,KAAKsZ,SAAS9iB,EAAMQ,SAAWR,EAAMQ,SAAWoc,EAAKpT,OACpE/N,EAAKuE,EAAMQ,QAEboc,EAAKqd,iBAAkBrd,EAAKpT,KAAM/N,EAAIu2B,GAAYQ,YAIpD5V,EAAK4c,cAAgB,KAEhBjoB,EAAAA,KAAKtB,IAA0B,OAEvCwO,EAAAuY,EAAApa,GAE0B,4BAAA,SAACzf,GAC1Byf,EAAK4c,cAAgB5c,EAAKvU,MACrB6xB,EAAAA,mBAAmB/8B,GAAG,MAC5BshB,EAAAuY,EAAApa,GAEwB,0BAAA,SAACzf,GACnB+8B,EAAAA,mBAAmB/8B,GAAG,MAxtDZ65B,GAAAA,EAAApa,GAAOqb,IAMtBrb,EAAK/mB,OAASA,EAMT24B,EAAAA,cAAgBliB,EAAK7D,qB1B/EV0C,E0BiFP6rB,EAAApa,I1BhFJ7mB,QAAUH,EAASG,QAAQ0M,KAAK0I,GACvCA,EAAOtU,QAAUjB,EAASiB,QAAQ4L,KAAK0I,GACvCA,EAAOlU,SAAWrB,EAASqB,SAASwL,KAAK0I,G0BgFjCgvB,IAAAA,EAAgBvd,EAAK0J,YAAY6T,cACnCvd,GAAAA,EAAK/mB,OAAOkgC,QAAQ3/B,OAAQ,CAC9B,IAAMgkC,EAAaxd,EAAK/mB,OAAOkgC,QAAQzgC,QAAQ,WAC3C8kC,GAAc,GAAKD,IAChBtkC,EAAAA,OAAOkgC,QAAQqE,GAAcD,QAE3BA,GACJtkC,EAAAA,OAAOkgC,QAAQ53B,KAAKg8B,GA6P3B,GAzPAvd,EAAKyd,UAAY,KAIjBzd,EAAK0d,UAAY,KAOjB1d,EAAK2d,cAAe,EAKpB3d,EAAK4d,OAAS5D,GAOdha,EAAK6d,MAAO,EAOZ7d,EAAK8d,SAAU,EAKf9d,EAAKC,WAAY,EAOjBD,EAAK+d,WAAY,EAMjB/d,EAAKge,WAAY,EAKjBhe,EAAK8b,cAAe,EAOpB9b,EAAK4b,aAAc,EAInB5b,EAAKie,UAAY,EAMjBje,EAAK1J,UAAW,EAOhB0J,EAAK6c,YAAa,EAKlB7c,EAAKgd,eAAgB,EAKrBhd,EAAKke,oBAAqB,EAO1Ble,EAAK4c,cAAgB,KAErB5c,EAAKme,aAAe,GAOpBne,EAAKoe,iBAAmB,KAMxBpe,EAAKqe,cAAgB,KAKrBre,EAAKse,QAAU,GAKfte,EAAK+c,kBAAoB,KAKzB/c,EAAKue,aAAe,EAKpBve,EAAKwe,YAAc,EAEnBxe,EAAKye,SAAW,CACdC,GAAI,EACJ1xB,MAAO,EACPC,QAAQ,EACRvC,EAAG,EACHC,EAAG,EACHlE,GAAG,EACHD,GAAG,EACHm4B,GAAI,EACJC,GAAI,GAGN5e,EAAK6e,SAAW,CACdv4B,MAAO,EACPC,OAAQ,EACRk0B,KAAM,EACN2C,IAAK,GAOPpd,EAAK8e,WAAa,CAChBjO,EAAG,EACHkO,IAAK,EACLC,QAAS,GAMXhf,EAAKif,YAAc,CACjBnxB,aAAa,EACbrB,SAAU,GAQZuT,EAAKkf,eAAiB,KAOtBlf,EAAKI,SAAW,KAMhBJ,EAAKmf,OAAS,KAOdnf,EAAKpT,KAAO,KAEZoT,EAAKof,OAAShlB,GAAKK,KAAKuF,EAAK4R,eAI3B7Q,GAAQ/F,GAAGkB,WACX6E,GAAQrE,UAAY,GACpBqE,GAAQrE,UAAY,IAEpBsD,EAAK/mB,OAAOonB,UAAW,GAOpBgf,EAAAA,SAAW,IAAIC,GAMpBtf,EAAK9J,cAAe,EAOpB8J,EAAKuf,iBAAmB,KAOxBvf,EAAKwf,mBAAqB,EAS1Bxf,EAAKyf,YAAc,CAEjBC,gBAAgB,GAMlB1f,EAAKwb,YAAcA,IACFxb,EAAK2f,WAOpB,OALQ9mC,QAAAA,MACN,IAAI61B,MAAK10B,kCAAAA,OAC2BgmB,EAAK/mB,OAAOqF,GAAE,uCAGpDshC,EAAA5f,GAIF,IAAAmb,EAAiCnb,EAAK/mB,OAAM4mC,EAAA1E,EAApC/B,WAAAA,OAAU,IAAAyG,EAAG,GAAEA,EAAEh7B,EAAGs2B,EAAHt2B,IACzB,GAAInL,MAAMsuB,QAAQoR,MAAAA,SAAAA,EAAY99B,OAAS89B,EAAW99B,KAAK9B,OAAS,EAAG,CACjE,IAAI6kC,EAAgBjF,EAAW99B,KAAK+zB,MAClC,SAAC9uB,GAAC,OAAKA,EAAE64B,YAAc74B,EAAE64B,aAAeA,EAAW0G,qBAGhDzB,IACQyB,EAAAA,kBAAoB1G,EAAW99B,KAAK,GAAG89B,WAClDiF,EAAgBjF,EAAW99B,KAAK,IAElC0kB,EAAKqe,cAAgBA,EAGhBx5B,IACE5L,EAAAA,OAAO4L,IAAMw5B,EAAcx5B,KAsBnCmb,OAlBDA,EAAK+f,cACL/f,EAAKggB,mBACLhgB,EAAKigB,mBACUlL,GAAAA,eAAcqF,EAAApa,IAG7BA,EAAKkgB,oBAEAC,EAAAA,SAASnG,IACdtqB,EAAKrS,WAAU+8B,EAAApa,IAAO,WACpBA,EAAKrL,KAAKtB,KACT,GACSsoB,QAAZA,GAAAra,EAAAtB,GAAKogB,mBAAOzE,GAAZA,EAAAt7B,KAAAihB,IAEItB,EAAK/mB,OAAOg+B,WAAajX,EAAK/mB,OAAOonB,aAClCL,EAAKqgB,UAAYrgB,EAAKsgB,MAAQtG,KACjCha,EAAK/kB,QAER+kB,EA2xEFyb,OAxxED5gC,EAAA4gC,EAAA,CAAA,CAAA3gC,IAAA,WAAAC,MAIA,WAAY,IAAAwlC,EAAAhf,EAAA3nB,KAEN,GADCgT,KAAAA,KAAOhT,KAAKX,OAAOqF,GAAKY,SAAS2C,eAAejI,KAAKX,OAAOqF,IAAM,MAClE1E,KAAKgT,KAAM,CACR/N,IAAAA,EAAKjF,KAAKX,OAAO4F,GACnBA,IAAAA,GAAsB,IAAhBA,EAAGoG,SAYJ,OATPrL,KAAK+a,KACHtB,EACA,IAAI/E,EAAO,MAAO1U,KAAKX,OAAOunC,IAAK,CACjCC,KAAM,GACNC,OAAQ,cACR9wB,IAAK,iCAGT/V,QAAQhB,MAAM,oDACP,EAXPe,KAAKgT,KAAO/N,EAcViK,IAAAA,EpBlQH,SAA0B8D,GAE/B,IADMrN,IAAAA,EAAOD,OAAOC,KAAKkW,IAChBla,EAAI,EAAGA,EAAIgE,EAAK/F,OAAQ+B,IAAK,CAC9BolC,IAAAA,EAAIlrB,GAAMlW,EAAKhE,IACjBolC,GAAAA,EAAE/zB,OAASA,EACN+zB,OAAAA,EAGJ,OAAA,KoB0POC,CAAgBhnC,KAAKgT,MAc7B,GAbA9D,IACF9P,EAASiB,QACP,sFAEF6O,EAAI0hB,WAEN5wB,KAAKgT,KAAKlN,aAAaqnB,GAAWntB,KAAKoc,UACvCpc,KAAK6R,MAAM/L,aAAaqnB,GAAWntB,KAAKoc,UAE7BuqB,QAAXA,EAAA/E,UAAA+E,IAAWA,GAAXA,EAAaz/B,IAAIlH,MACjB63B,GAAehX,KAAK7gB,MACpBA,KAAKinC,gBAEDjnC,KAAKX,OAAOmnB,SAAU,CACxB,IAAM0gB,EAAQlnC,KAAKX,OAAOmnB,SAASxT,MAAQ,KACrCwT,EAAWqR,GAAeqB,SAASl5B,KAAMsgC,GAAU,CAAEttB,KAAMk0B,IACjElnC,KAAKwmB,SAAWA,EAElB,IAAMrF,EACiC,WAArCnhB,KAAKX,OAAOk+B,qBAAoC,SAAWpW,GAAQhG,OAWjE,GAVC/a,KAAAA,SAAQhG,GAAAA,OACRo7B,GAAYC,QAAO,KAAAr7B,OAAIo7B,GAAYO,SAAQ37B,cAAAA,OAAa+gB,EAAM/gB,KAAAA,OAC/DJ,KAAKX,OAAOmnB,SAAW,GAAKgV,GAAYc,cAGxCt8B,KAAKX,OAAOonB,SACTrgB,KAAAA,SAASo1B,GAAYG,OAErBv1B,KAAAA,SAASo1B,GAAYK,UAExB77B,KAAKX,OAAO49B,MAAO,CACrB,IAAAkK,EAAwBnnC,KAAKX,OAAvBqN,EAAKy6B,EAALz6B,MAAOC,EAAMw6B,EAANx6B,OACQ,iBAAVD,GAAwC,iBAAXC,IAC9By6B,EAAA,IACCC,EAAA,OAEX,IAAMr6B,EAAQ,CACZN,MAAO,OACPC,OAAQ,IACR,YAAa,OACb,iBAAavM,OAAe,IAATuM,EAAgBD,EAAK,MAK1ChH,OAAOC,KAAKqH,GAAOpH,SAAQ,SAAC1E,GACrB8R,EAAAA,KAAKhG,MAAM9L,GAAO8L,EAAM9L,UAG/B,CAAC,QAAS,UAAU0E,SAAQ,SAAC1E,GACvBymB,EAAKtoB,OAAO6B,KACkB,iBAArBymB,EAAKtoB,OAAO6B,GACrBymB,EAAK3U,KAAKhG,MAAM9L,GAAOymB,EAAKtoB,OAAO6B,GAE9B8R,EAAAA,KAAKhG,MAAM9L,GAAI,GAAAd,OAAMunB,EAAKtoB,OAAO6B,GAAQ,UAKtD,IAAAomC,EAAqCtnC,KAAKgT,KAAKu0B,wBAAvC76B,EAAK46B,EAAL56B,MAAOC,EAAM26B,EAAN36B,OAAQk0B,EAAIyG,EAAJzG,KAAM2C,EAAG8D,EAAH9D,IAKtB,OAJPxjC,KAAKilC,SAASv4B,MAAQA,EACtB1M,KAAKilC,SAASt4B,OAASA,EACvB3M,KAAKilC,SAASpE,KAAOA,EACrB7gC,KAAKilC,SAASzB,IAAMA,GACb,IAGT,CAAAtiC,IAAA,gBAAAC,MAGA,WAKEnB,KAAKulC,OAAS,KAKdvlC,KAAKwnC,QAAU,KAKfxnC,KAAKynC,SAAW,KAEZznC,KAAKX,OAAO0/B,iBACd/+B,KAAKslC,eAAiBxvB,EAAK9Q,UACzB,qBACA,GACA,CAAE,cAAc,GAChB,sBAEGgO,KAAAA,KAAKC,YAAYjT,KAAKslC,mBAI/B,CAAApkC,IAAA,cAAAC,MAGA,WAAe,IAAAymB,EAAA5nB,KACb,CAAC,QAAS,QAAQ4F,SAAQ,SAACC,GACzB+hB,EAAKrM,GAAG1V,EAAM+hB,EAAK,KAAO/hB,EAAKkiB,OAAO,GAAGC,cAAgBniB,EAAKqC,MAAM,QAGpDtC,GAAAA,SAAQ,SAACC,GACzBP,UAAYA,SAAS4iB,iBAAiBriB,EAAM+hB,EAAK8b,uBAG/Cvc,GAAQ/F,GAAGyB,QACb7iB,KAAK6R,MAAMqW,iBAAkB,wBAAyBloB,KAAK0nC,0BAC3D1nC,KAAK6R,MAAMqW,iBAAkB,sBAAuBloB,KAAK2nC,yBAGtDhuB,KAAAA,KAAKF,EAAoBzZ,KAAKk4B,QAEnCl4B,KAAK4nC,SAAW,WACThgB,EAAKvoB,OAAO6+B,sBACftW,EAAK/V,MAAM6uB,SAGV/mB,KAAAA,KAAKF,EAAazZ,KAAK4nC,YAG9B,CAAA1mC,IAAA,gBAAAC,MAGA,WAAiB,IAAAgnB,EAAAnoB,KACfA,KAAKgT,KAAKoV,oBAAoB,YAAapoB,KAAK6nC,eAC9BjiC,GAAAA,SAAQ,SAACC,GAChBuiB,SAAAA,oBAAoBviB,EAAMsiB,EAAKub,uBAE1C1jC,KAAK4nC,UAAY5nC,KAAKyb,IAAIhC,EAAazZ,KAAK4nC,UACvCnsB,KAAAA,IAAIhC,EAAgBzZ,KAAKoiC,aAC9BpiC,KAAK6R,MAAMuW,oBAAqB,wBAAyBpoB,KAAK0nC,0BAC9D1nC,KAAK6R,MAAMuW,oBAAoB,sBAAuBpoB,KAAK2nC,0BAC5D,CAAAzmC,IAAA,kBAAAC,MAED,WACOnB,KAAK6jC,YAGLl/B,EAAAA,aAAa3E,KAAMA,KAAK6jC,WAC7B7jC,KAAK6jC,UAAY,QAGnB,CAAA3iC,IAAA,aAAAC,MAKA,SAAY8J,GAAmB,IAAAqd,EAAAtoB,KAAdmC,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACrB,GAACK,KAAK6R,QAIP5G,GACO,KAARA,IACsB,UAArB6K,EAAKpO,OAAOuD,IAAmC,IAAfA,EAAIrL,UAE/BqL,EAAA,GACNjL,KAAK+a,KAAKtB,IACVra,EAASiB,QACP,sEAEEL,KAAKX,OAAO29B,eAThB,CAcElnB,EAAKpH,UAAUvM,EAAQ2lC,iBAGzB9nC,KAAK+nC,eAAiB5lC,EAAQ2lC,eAG5B9nC,KAAK+jC,eACFxZ,KAAAA,oBAAoBvqB,KAAK6R,OACL,UAArBiE,EAAKpO,OAAOuD,IAAoBA,EAAIrL,OAAS,EAC1C4qB,KAAAA,oBAAoBxqB,KAAK6R,MAAO5G,GAC3BjL,KAAK6R,MAAMlH,KAAO3K,KAAK6R,MAAMlH,MAAQM,EAErCA,GACL4G,KAAAA,MAAMkX,gBAAgB,OAF3B/oB,KAAK6R,MAAMlH,IAAMM,GAMmB,WAApC6K,EAAKpO,OAAO1H,KAAKX,OAAOomB,UACrBA,KAAAA,OAASzlB,KAAKX,OAAOomB,QAG5B,IAAMyhB,EAAQlnC,KAAKslC,eAAiBtlC,KAAKslC,eAAiBtlC,KAAKgT,KAC3DhT,KAAK6R,iBAAiBlT,OAAOqyB,UAAYkW,EAAM5a,SAAStsB,KAAK6R,QAC/Dq1B,EAAMvQ,aAAa32B,KAAK6R,MAAOq1B,EAAMc,YAG/BzyB,IAAAA,EAAevV,KAAK6R,MAApB0D,WACChW,EAAAA,QAAQ,wBAAyBgW,GACtCvV,KAAKX,OAAOonB,YACb3Q,EAAKnE,MAAM3R,KAAK6R,QAAU7R,KAAKgpB,QAE/B7B,GAAQ/F,GAAGoB,QAAU2E,GAAQ/F,GAAGwB,UAAY5iB,KAAKmiC,aAG5C9D,IAAAA,EAAcr+B,KAAKX,OAAnBg/B,UACH2D,KAAAA,YAAc3D,EAAY,EAAIA,GAAY,EAC/Cr+B,KAAKX,OAAOg/B,UAAY,EACpB9oB,GAAc,GAAKvV,KAAK6S,SAAW,EACrC7S,KAAKoiC,cAEA7mB,KAAAA,GAAG9B,EAAgBzZ,KAAKoiC,eAE1BpiC,KAAKymC,UAAYzmC,KAAK0mC,MAAQtG,KACjCvI,GAAe+C,UAAU56B,MAE3BA,KAAKymC,UAAW,EACXF,KAAAA,SAASnG,IACT38B,EAAAA,WAAWzD,MAAM,WACpBsoB,EAAKvN,KAAKtB,MACT,MAGL,CAAAvY,IAAA,mBAAAC,MAKA,WAAiC,IAAA2nB,EAAA9oB,KAAfioC,IAAMtoC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GAItBK,KAAKs6B,gBAAkB,GACvB,IAAMqE,EAAU3+B,KAAKX,OAAOs/B,SAAW,GACjCjQ,EAAU1uB,KAAKX,OAAOqvB,SAAW,GACjCtZ,EAAOpV,KAAKX,OAAO+V,MAAQ,GACjC6yB,GAAUznB,GAAKE,OAAOtL,EAAMpV,KAAKwlC,QAC3B0C,IAAAA,EAAavJ,EAAQ92B,KAAK,MAAM6Z,cAAcza,MAAM,MACpDkhC,EAAYnoC,KAAK0uB,QACf9oB,EAAAA,SAAQ,SAAC+oB,GACX,IACF,IAAMb,EAAaa,EAAOA,OACtBA,EAAOA,OAAOb,WACda,EAAOb,WAEX,GAAIA,GAAcoa,EAAWppC,QAAQgvB,EAAWpM,gBAAqB,EAC5D,OAAA,KAGT,IAAKumB,GAAUE,EAAUra,EAAWpM,eAClC,OAGEiN,GAAAA,EAAOyZ,MAAQzZ,EAAOoK,OAAQ,CAChC,IAAMsP,EAAgBxQ,GAAee,aAAa9P,EAAM6F,GAmBxD,YAlBIA,EAAO2Z,kBACTD,EACG9a,MAAK,WACJzE,EAAKwR,gBAAgBjuB,OACnByc,EAAKwR,gBAAgBx7B,QAAQupC,GAC7B,MAGHna,OAAM,SAACvnB,GACGlG,EAAAA,SAAS,iCAAkCkG,GACpDmiB,EAAKwR,gBAAgBjuB,OACnByc,EAAKwR,gBAAgBx7B,QAAQupC,GAC7B,MAGD/N,EAAAA,gBAAgB3yB,KAAK0gC,KAKvBvf,OAAAA,EAAK2H,eAAe9B,SACpBtoB,GACE5F,EAAAA,SAAS,oBAAqB4F,SAM7C,CAAAnF,IAAA,mBAAAC,MAGA,WAAoB,IAAAonC,EAAAvoC,KAClBA,KAAKX,OAAOkgC,QAAQ35B,SAAQ,SAAC8nB,IHhuBR,SAAC/Y,EAAQ6zB,GAAW,IAAAC,EAAAC,EAQ3CC,EANIH,EAAO9a,QAAU8a,EAAOrmC,QAEb,IAAKqmC,EAAO9a,OAAQ8a,EAAOrmC,QAASwS,EAAOtV,QAE3C,IAAImpC,EAAO,GAAI7zB,EAAOtV,QAEmCupC,EAAAD,EAAhEja,QAAAA,OAAU,IAAHka,EAAG,GAAEA,EAAAC,EAAAF,EAAEhK,QAAAA,OAAU,IAAHkK,EAAG,GAAEA,EAAAC,EAAAH,EAAEhV,MAAAA,OAAK,IAAAmV,EAAG,GAAEA,EAAAC,EAAAJ,EAAEvzB,KAAAA,OAAO,IAAH2zB,EAAG,GAAEA,EACpDp0B,EAAOtV,OAAOqvB,UACVrvB,EAAAA,OAAOqvB,QAAU,IAGrB/Z,EAAOtV,OAAOs/B,UACVt/B,EAAAA,OAAOs/B,QAAU,KAG1B8J,EAAA9zB,EAAOtV,OAAOqvB,SAAQ/mB,KAAIxH,MAAAsoC,EAAA19B,EAAI2jB,KAC9Bga,EAAA/zB,EAAOtV,OAAOs/B,SAAQh3B,KAAIxH,MAAAuoC,EAAA39B,EAAI4zB,IAC9Bj5B,OAAOC,KAAKguB,GAAO/rB,KAAI,SAAA1G,GAChByT,EAAOtV,OAAOs0B,MAAMzyB,KAChB7B,EAAAA,OAAOs0B,MAAMzyB,GAAOyyB,EAAMzyB,OAGrC,IAAM8nC,EAASr0B,EAAOtV,OAAO+V,MAAQ,GACrCA,EAAKzN,KAAIxH,MAATiV,EAAIrK,EAASi+B,IACbr0B,EAAOtV,OAAO+V,KAAOA,EGusBjB6zB,CAAUV,EAAM7a,QAIpB,CAAAxsB,IAAA,qBAAAC,MAIA,SAAoBw3B,GAClB,IAAIuO,EAAQ,KACJvO,OAAAA,GAAAA,KACDlG,GAAUE,WACR3yB,KAAKynC,WACRznC,KAAKynC,SAAW3xB,EAAK/C,kBAAkB,eAAgB/S,KAAKgT,OAE9Dk0B,EAAQlnC,KAAKynC,SACb,MAAA,KACGhV,GAAUC,UACR1yB,KAAKwnC,UACRxnC,KAAKwnC,QAAU1xB,EAAK/C,kBAAkB,cAAe/S,KAAKgT,OAE5Dk0B,EAAQlnC,KAAKwnC,QACb,MAAA,KACG/U,GAAUG,SACR5yB,KAAKulC,SACRvlC,KAAKulC,OAASzvB,EAAK/C,kBAAkB,aAAc/S,KAAKgT,MACpDhT,KAAKX,OAAO++B,gBACdtoB,EAAK1P,SAASpG,KAAKulC,OAAQ/J,GAAYkB,mBAG3CwK,EAAQlnC,KAAKulC,OACb,MAAA,QAEQ2B,EAAAlnC,KAAKslC,gBAAkBtlC,KAAKgT,KAGjCk0B,OAAAA,IAGT,CAAAhmC,IAAA,iBAAAC,MAMA,SAAgBwtB,EAAQtvB,GACtB,IAAM6pC,EAAarR,GAAeS,iBAAiB3J,EAAQtvB,GACnDk5B,EAAqB2Q,EAArB3Q,QAASp2B,EAAY+mC,EAAZ/mC,QAGTusB,EAAY1uB,KAAKX,OAAjBqvB,SACMmJ,GAAeW,mBAAmBD,EAAQzK,WAAYY,IAC1DA,EAAQ/mB,KAAK4wB,GAGvB,IAAMG,EAAWb,GAAeY,gBAAgBF,EAAQzK,WAAY9tB,KAAKX,QAChE2T,EAAAA,OAAS7Q,EAAQ6Q,KAAO0lB,EAAS1lB,MACjC2lB,EAAAA,WAAax2B,EAAQw2B,SAAWD,EAASC,UAElD,IAQEwQ,EARIxQ,EAAWx2B,EAAQw2B,SACrBx2B,EAAQw2B,SACPx2B,EAAQ9C,QAAU8C,EAAQ9C,OAAOs5B,UACjCJ,EAAQiB,eAAiBjB,EAAQiB,cAAcb,SAElD,OAACx2B,EAAQ6Q,MACW,iBAAb2lB,GACPA,EAAS75B,QAAQ,aACjB,EACoB,QAApBqqC,EAAOnpC,KAAKwmB,gBAAL2iB,IAAaA,OAAbA,EAAAA,EAAe1Y,eAAe8H,EAASp2B,EAASo2B,EAAQzK,aAE5D3rB,EAAQ6Q,OACHA,EAAAA,KAAOhT,KAAKopC,mBAAmBzQ,IAElCd,GAAeqB,SAASl5B,KAAMu4B,EAASp2B,MAGhD,CAAAjB,IAAA,aAAAC,MAIA,SAAYwtB,GACY,iBAAXA,EACM8K,GAAAA,WAAWz5B,KAAM2uB,GACvBA,aAAkBY,IACZkK,GAAAA,WAAWz5B,KAAM2uB,EAAOb,cAI3C,CAAA5sB,IAAA,mBAAAC,MAKA,SAAkBwtB,GAAQ0a,IAAAA,EAAiB1pC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GACzCK,KAAKspC,WAAW3a,GACZ0a,GACFrpC,KAAKupC,uBAAuB5a,KAE/B,CAAAztB,IAAA,yBAAAC,MAED,SAAwBwtB,GAClBb,IAAAA,EAMJ,GALsB,iBAAXa,EACIA,EAAAA,EACJA,aAAkBY,KAC3BzB,EAAaa,EAAOb,YAEjBA,EAGInsB,IAAAA,IAAAA,EAAI3B,KAAKX,OAAOqvB,QAAQ9uB,OAAS,EAAG+B,KAAQA,IAAK,CAExD,GADe3B,KAAKX,OAAOqvB,QAAQ/sB,GACxBmsB,WAAWpM,gBAAkBoM,EAAWpM,cAAe,CAChE1hB,KAAKX,OAAOqvB,QAAQriB,OAAO1K,EAAG,GAC9B,UAKN,CAAAT,IAAA,UAAAK,IAIA,WACSs2B,OAAAA,GAAeiC,WAAW95B,QAGnC,CAAAkB,IAAA,YAAAC,MAKA,SAAW64B,GACT,IAAMrL,EAASkJ,GAAekC,WAAW/5B,KAAMg6B,GAC/C,OAAOrL,MAAAA,GAAAA,EAAQb,WAAaa,EAAS,OAGvC,CAAAztB,IAAA,WAAAC,MAIA,SAAUqE,GACHxF,KAAKgT,OAGL8C,EAAKxP,SAAStG,KAAKgT,KAAMxN,IACvBY,EAAAA,SAASpG,KAAKgT,KAAMxN,MAI7B,CAAAtE,IAAA,cAAAC,MAKA,SAAaqE,GACNxF,KAAKgT,MAGL7L,EAAAA,YAAYnH,KAAKgT,KAAMxN,KAG9B,CAAAtE,IAAA,WAAAC,MAKA,SAAUqE,GACJ,GAACxF,KAAKgT,KAGV,OAAO8C,EAAKxP,SAAStG,KAAKgT,KAAMxN,KAGlC,CAAAtE,IAAA,eAAAC,MAMA,SAAcD,EAAKC,GACZnB,KAAKgT,MAGLA,KAAAA,KAAKlN,aAAa5E,EAAKC,KAG9B,CAAAD,IAAA,kBAAAC,MAMA,SAAiBD,EAAKC,GACfnB,KAAKgT,MAGLA,KAAAA,KAAK+V,gBAAgB7nB,EAAKC,KAGjC,CAAAD,IAAA,QAAAC,MAMA,SAAO8J,GAAK,IAAAu+B,EAAAxpC,KAEN,KAAAA,KAAK0mC,MAAQtG,IAAb,CAIJ,IAAM0H,EAAgB9nC,KAAK+nC,eAY3B,OAXIjyB,EAAKpH,UAAUo5B,KACjB9nC,KAAK+nC,oBAAiB1kC,GAGnB4H,GAAQjL,KAAKX,OAAO4L,KACvBjL,KAAKsmC,oBAEPtmC,KAAKymC,UAAW,EACXF,KAAAA,SAASnG,IAEdpgC,KAAKqmC,kBAAiB,GACfxO,GACJqC,WAAWl6B,MACXutB,MAAK,WAEA,GAACic,EAAKnqC,OAAN,CAGC4L,IACGu+B,EAAAA,EAAKv+B,KAAOu+B,EAAKnqC,OAAO4L,KAE1Bw+B,IAAAA,EAAQD,EAAK9K,cAAczzB,GAE1BiE,OADKs6B,EAAKE,WAAWD,EAAMx+B,IAAK,CAAE68B,cAAAA,QAG1C5Z,OAAM,SAACvnB,GAIAA,MAHNA,EAAEgjC,SAAW,SACbhjC,EAAEijC,WAAa,MACNnpC,EAAAA,SAAS,oBAAqBkG,GACjCA,QAIZ,CAAAzF,IAAA,YAAAC,MAKA,SAAW8J,EAAK9I,GAAS,IAAA0nC,EAAA7pC,KACnB8pC,EAAO7+B,EACc,WAArB6K,EAAKpO,OAAOuD,KACd6+B,EAAO7+B,EAAIA,KAEN6+B,EAAA9pC,KAAK0+B,cAAcoL,GAAM7+B,IAChC,IAAM8+B,EAAU/pC,KAAKkU,YACrBlU,KAAKgiC,YAAc+H,EACnB,IAAMC,EAAWhqC,KAAKqlB,SAAWrlB,KAAKkkC,QAEtC,OADAlkC,KAAK2K,IAAMm/B,EACJ,IAAI5lB,SAAQ,SAACC,EAASiV,GACrB6Q,IAAAA,EAAS,SAACtjC,GACT8U,EAAAA,IAAI,aAAcyuB,GAClBzuB,EAAAA,IAAI,UAAWyuB,GACpB9Q,EAAOzyB,IAEHujC,EAAW,WACfL,EAAK5H,mBACD+H,GACFH,EAAKtgB,QAEF9N,EAAAA,IAAI,QAASwuB,GAClB9lB,GAAQ,IAELxK,EAAAA,KAAK,QAASswB,GACdH,GAID3iB,GAAQ/F,GAAGkB,UACR3I,EAAAA,KAAK,aAAcuwB,GAEnBvwB,EAAAA,KAAK,UAAWuwB,GAEvBL,EAAKngB,QARHmgB,EAAK/kB,aAAa,QAAS,CAACpP,KAAM,EAAGlW,QAAS,mBAYpD,CAAA0B,IAAA,YAAAC,MAIA,WACEnB,KAAKmiC,cAGP,CAAAjhC,IAAA,YAAAC,MAGA,WAAa,IAAAgpC,EAAAnqC,KACX,IAAKA,KAAKymC,UAAYzmC,KAAK0mC,MAAQtG,GAKjC,OAJKj5B,KAAAA,YAAYq0B,GAAYK,UACxBz1B,KAAAA,SAASo1B,GAAYG,OAC1B37B,KAAKqB,aACLrB,KAAKkiC,cAAe,GAGlBliC,KAAK0mC,MAAQtG,KACVj5B,KAAAA,YAAYq0B,GAAYK,WAC5B77B,KAAKokC,WAAapkC,KAAKoG,SAASo1B,GAAYG,QAEzCyO,IAAAA,EAAWtf,EAAAC,EAAA8W,EAAAt7B,WAAAE,OAAAA,MAAAA,KAAezG,MAmDzBoqC,YAlDa/mC,IAAhB+mC,GAA6BA,GAAeA,EAAY7c,KAC1D6c,EACG7c,MAAK,WACCpmB,EAAAA,YAAYq0B,GAAYmB,oBACxBv2B,EAAAA,SAASo1B,GAAYtlB,SACtBi0B,EAAKzD,MAAQtG,KACfhhC,EAASG,QAAQ,wBACZgnC,EAAAA,SAASnG,IACd+J,EAAKpvB,KAAKtB,QAGbyU,OAAM,SAACvnB,GAEN,GADStG,EAAAA,QAAQ,wBAAyBsG,EAAE+E,MACxCy+B,EAAKt4B,OAASs4B,EAAKt4B,MAAM5S,MAK3B,OAJAkrC,EAAKE,eAEAljC,EAAAA,YAAYq0B,GAAYG,OAKhB,oBAAXh1B,EAAE+E,OAIJy+B,EAAKG,YAAcx0B,EAAKrS,WACtB0mC,GACA,WACEA,EAAKG,YAAc,KACnBH,EAAKpvB,KAAKtB,IACLrT,EAAAA,SAASo1B,GAAYmB,oBACrBx1B,EAAAA,YAAYq0B,GAAYG,OAC7BwO,EAAK5gB,QACAgd,EAAAA,SAASnG,MAEhB,QAKRhhC,EAASiB,QAAQ,iCACbL,KAAK0mC,MAAQtG,KACVmG,KAAAA,SAASnG,IACTj5B,KAAAA,YAAYq0B,GAAYmB,oBACxBx1B,KAAAA,YAAYq0B,GAAYK,UACxB10B,KAAAA,YAAYq0B,GAAYG,OACxBv1B,KAAAA,SAASo1B,GAAYtlB,SAC1BlW,KAAK+a,KAAKtB,MAGP2wB,IAGT,CAAAlpC,IAAA,aAAAC,MAGA,WACE4pB,EAAAA,EAAA8W,EAAAt7B,yBAAAE,KAAAzG,QAGF,CAAAkB,IAAA,aAAAC,MAIA,WACE4pB,EAAAA,EAAA8W,EAAAt7B,yBAAAE,KAAAzG,QACD,CAAAkB,IAAA,OAAAC,MAED,WAAQ,IAAAopC,EAAAvqC,KAECguB,OADF7mB,KAAAA,YAAYq0B,GAAYI,QACtB5N,GAAShuB,KAAM,QAAQ,WAC5B,OAAOuqC,EAAKpI,iBAEf,CAAAjhC,IAAA,QAAAC,MAED,WAAS,IAAAqpC,EAAAxqC,KACEguB,GAAAhuB,KAAM,SAAS,WACtB+qB,EAAAA,EAAA8W,EAAAt7B,WAAA,QAAAikC,GAAA/jC,KAAA+jC,QAIJ,CAAAtpC,IAAA,OAAAC,MAMA,SAAM+B,EAAMunC,GAAQ,IAAAC,EAAA1qC,KACd,GAACA,KAAK6R,QAASykB,OAAOptB,MAAMotB,OAAOpzB,KAAWlD,KAAKymC,SAAnD,CAGJ,IAAAkE,EAAuC3qC,KAAKX,OAApCurC,EAAYD,EAAZC,aAActM,EAAYqM,EAAZrM,aAChBuM,EAAUJ,IAAWG,EAAe,OAAStM,GAC5Cp7B,EAAAA,EAAO,EAAI,EAAIA,EAAOlD,KAAK6S,SAAWhF,SAAS7N,KAAK6S,SAAU,IAAM3P,GAE1ElD,KAAK4lC,qBAAuB5lC,KAAK4lC,mBAAqB5lC,KAAKqlB,OAAS,EAAI,GAEzErlB,KAAK2lC,kBAAoB3lC,KAAKyb,IAAIhC,EAAezZ,KAAK2lC,kBAEtD3lC,KAAK2lC,iBAAmB,WAIdkF,OAFH1jC,EAAAA,YAAYq0B,GAAYG,OAC7B+O,EAAKvG,WAAY,EACT0G,GACD,IAAA,OACHH,EAAKhhB,OACL,MACG,IAAA,QACHghB,EAAKnhB,QACL,MAAA,QAEKqc,EAAAA,mBAAqB,GAAK8E,EAAKrlB,OAASqlB,EAAKnhB,QAAUmhB,EAAKhhB,OAErEghB,EAAK9E,mBAAqB,EAC1B8E,EAAK/E,iBAAmB,MAGrBhsB,KAAAA,KAAKF,EAAezZ,KAAK2lC,kBAC1B3lC,KAAK0mC,MAAQtG,IACVj5B,KAAAA,YAAYq0B,GAAYK,UAC7B77B,KAAKkU,YAAchR,EAEnBlD,KAAK0pB,QAEL1pB,KAAKkU,YAAchR,KAEtB,CAAAhC,IAAA,oBAAAC,MAED,WAAqB,IAAA2pC,EAAA9qC,KAEnB+qC,EAA4B/qC,KAAKX,OAAzBmgC,EAAUuL,EAAVvL,YAAeuL,EAAH9/B,KAGlBu0B,GACAA,EAAW99B,MACX89B,EAAW99B,KAAK9B,OAAS,GACzB4/B,EAAW0G,mBAEAxkC,EAAAA,KAAKkG,KAAI,SAAC/B,GACfA,EAAK25B,aAAeA,EAAW0G,oBAC5B7mC,EAAAA,OAAO4L,IAAMpF,EAAKoF,IACvB6/B,EAAKrG,cAAgB5+B,QAS7B,CAAA3E,IAAA,mBAAAC,MAKA,SAAkByhC,EAAID,GAAM,IAAAqI,EAAAhrC,KAClBw/B,EAAex/B,KAAKX,OAApBmgC,WAeJ,GAbA1/B,MAAMsuB,QAAQoR,MAAAA,OAAU,EAAVA,EAAY99B,OACjBA,EAAAA,KAAKkE,SAAQ,SAACC,IACnB+8B,MAAAA,OAAAA,EAAAA,EAAIpD,cAAe35B,EAAK25B,aAC1BwL,EAAKvG,cAAgB5+B,MAKvB+8B,MAAAA,GAAAA,EAAIqI,SAAiC,iBAAfrI,EAAGqI,UAC3BrI,EAAGqI,QAAUp9B,SAAS+0B,EAAGqI,QAAS,KAAO,GAG3CjrC,KAAK+a,KAAKtB,GAA0B,CAAEkpB,KAAAA,EAAMC,GAAAA,IACvC5iC,KAAKymC,SAAN,CAIJ,IAAMv3B,EAAMlP,KAAKkrC,UAAUtI,EAAG33B,IAAGslB,EAAA,CAC/B4a,UAAkC,IAAxB3L,EAAW2L,UACO,oBAAhB1nB,aACgC,mBAAhCA,YAAYC,iBACrBkf,IAED1zB,GAAOA,EAAIqe,KACbre,EAAIqe,MAAK,WACPyd,EAAKjwB,KAAKtB,GAAgC,CAAEkpB,KAAAA,EAAMC,GAAAA,OAGpD5iC,KAAK+a,KAAKtB,GAAgC,CAAEkpB,KAAAA,EAAMC,GAAAA,SAd7CvjC,KAAAA,OAAO4L,IAAM23B,EAAG33B,MAgBxB,CAAA/J,IAAA,SAAAC,MAED,WACEnB,KAAKgpB,OAILhpB,KAAKorC,WAAa,WAChBprC,KAAK0pB,QAEF/P,KAAAA,KAAKF,EAAoBzZ,KAAKorC,cACpC,CAAAlqC,IAAA,aAAAC,MAED,WAAc,IAAAkqC,EAAArrC,KAYNsrC,EAAU,CADZ9P,GATFmB,mBASEnB,GARFtlB,QAQEslB,GAPFK,SAOEL,GANFI,OAMEJ,GALF/jB,OAKE+jB,GAJFG,MAIEH,GAHFrlB,MAGEqlB,GAFFnlB,MAEEmlB,GADFzjB,SAaF/X,KAAKymC,UAAW,EAChBzmC,KAAKkkC,SAAU,EACflkC,KAAKkiC,cAAe,EACpBliC,KAAKurC,aACLvrC,KAAKklC,WAAWC,IAAM,EACtBnlC,KAAKklC,WAAWjO,EAAI,EACpBj3B,KAAKklC,WAAWE,QAAU,EAClBx/B,EAAAA,SAAQ,SAAC4lC,GACfH,EAAKlkC,YAAYqkC,MAEdplC,KAAAA,SAASo1B,GAAYK,UAC1B77B,KAAK+a,KAAKtB,MAGZ,CAAAvY,IAAA,QAAAC,MAMA,WAA8C,IAAAsqC,EAAAzrC,KAAvC0rC,EAAiB/rC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIgsC,EAAahsC,UAAAC,OAAAD,EAAAA,kBAAA0D,EAC1CrD,KAAK4rC,aACL,IAAQld,EAAY1uB,KAAZ0uB,QAER,GAAKA,IAIa9mB,EAAAA,KAAI,SAACikC,GACrBJ,EAAKnC,WAAWuC,MAGdF,GAAe,CACjB,IAAMG,EAAK/O,KACXr3B,OAAOC,KAAK3F,KAAKX,QAAQuG,SAAQ,SAAC0jB,GAEX,cAAnBmiB,EAAKpsC,OAAOiqB,IACL,YAANA,GAAyB,YAANA,GAAyB,OAANA,GAAoB,OAANA,IAEhDjqB,EAAAA,OAAOiqB,GAAKwiB,EAAGxiB,UAM5B,CAAApoB,IAAA,UAAAC,MAIA,WAAW,IAAA4qC,EAAAC,EAAAhsC,KACDslC,EAAgCtlC,KAAhCslC,eAAgBtyB,EAAgBhT,KAAhBgT,KAAMnB,EAAU7R,KAAV6R,MAC1B,GAACmB,GAASnB,EAAV,CAqBJ,GAlBA7R,KAAKymC,UAAW,EAChBzmC,KAAKkiC,cAAe,EACpBlvB,EAAK+V,gBAAgBoE,IACrBtb,EAAMkX,gBAAgBoE,IACtBntB,KAAKisC,UAAU,WACfjsC,KAAKksC,gBACA3hB,KAAAA,oBAAoBvqB,KAAK6R,OAC9BiE,EAAKxJ,eAAetM,MACpBA,KAAK+a,KAAKtB,IACCsyB,QAAXA,EAAAnK,UAAAmK,IAAWA,GAAXA,EAAa3kC,OAAOpH,MACpB63B,GAAejH,QAAQ5wB,MACvBgvB,GAAmBhvB,MACnB+qB,EAAAA,EAAA8W,EAAAt7B,2BAAAE,KAAAzG,MAEIA,KAAKijC,YAAcjjC,KAAKgjC,gBAAkBhjC,KAAKgT,MACjDhT,KAAKmsC,iBAGH7G,EAEF,IADA,IAAM/c,EAAK+c,EAAen/B,SACjBxE,EAAI,EAAGA,EAAI4mB,EAAG3oB,OAAQ+B,IACdknB,EAAAA,YAAYN,EAAG5mB,KAGjC2jC,GACDzzB,aAAiBlT,OAAOiM,MACtBoI,EAAKsZ,SAASza,KAAW7R,KAAKX,OAAO+sC,yBACrCp5B,EAAK6V,YAAYhX,GACnB,CAAC,SAAU,UAAW,WAAY,kBAAkBjK,KAAI,SAAC/B,GACvDmmC,EAAKnmC,IAASmN,EAAK6V,YAAYmjB,EAAKnmC,IACpCmmC,EAAKnmC,GAAQ,QAEf,IAAMwmC,EAAQr5B,EAAKxN,UAAUyB,MAAM,KAC/BolC,EAAMzsC,OAAS,EACjBoT,EAAKxN,UAAY6mC,EACdrqB,QAAO,SAACtW,GAASA,OAAAA,EAAK5M,QAAQ,YAAc,KAC5C+I,KAAK,KAERmL,EAAKxN,UAAY,GAEnBxF,KAAK+oB,gBAAgB,eAGnB,CAAA,YACA,YACA,WACA,gBACA,cACAnjB,SAAQ,SAAC1E,GACT8qC,EAAK9qC,IAAO,QAEf,CAAAA,IAAA,SAAAC,MAED,WAAU,IAAAmrC,EAAAtsC,KACHmH,KAAAA,YAAYq0B,GAAYrlB,OAC7BnW,KAAKkU,YAAc,EACnBlU,KAAKmkC,WAAY,EACRnW,GAAAhuB,KAAM,UAAU,WAClB2Z,EAAAA,KAAKF,GAAe,WACjB2wB,IAAAA,EAAckC,EAAKnK,YACrBiI,GAAeA,EAAYlc,OACjBA,EAAAA,OAAM,SAAA7nB,GAChBpG,QAAQC,IAAImG,SAIlBimC,EAAKvxB,KAAKtB,IACV6yB,EAAKC,cAER,CAAArrC,IAAA,QAAAC,MAED,WAAS,IAAAqrC,EAAAxsC,KACFmH,KAAAA,YAAYq0B,GAAYnlB,OACxBjQ,KAAAA,SAASo1B,GAAYzjB,SACjBiW,GAAAhuB,KAAM,SAAS,WACtB,IAAMysC,EAAMD,EAAKt4B,YACTjJ,EAAQuhC,EAAKntC,OAAb4L,IACFyhC,EAAW52B,EAAKnE,MAAM66B,EAAK36B,OAAmC,CAAE5G,IAAAA,GAA5BuhC,EAAK9N,cAAczzB,GAC7DuhC,EAAK7hC,IAAM+hC,EAAQzhC,KAClBuhC,EAAKntC,OAAO+9B,SAAWoP,EAAKt4B,YAAcu4B,GACtC9yB,EAAAA,KAAKF,GAAgB,WACxB+yB,EAAKrK,oBAKX,CAAAjhC,IAAA,kBAAAC,MAOA,SAAiB6R,EAAM/N,EAAI0nC,EAAWC,GAC/B55B,IAGA45B,IACHA,EAAapR,GAAYY,mBAEtBp8B,KAAK0kC,UACHA,KAAAA,QAAU5uB,EAAKhH,oBAAoBkE,IAErC5M,EAAAA,SAAS4M,EAAM25B,GAChB1nC,GAAMA,IAAO+N,IAAShT,KAAK6sC,WAIxBA,KAAAA,SAAW/2B,EAAKhH,oBAAoB7J,GACpCmB,EAAAA,SAASnB,EAAI2nC,GACf9mC,EAAAA,aAAaqnB,GAAWntB,KAAKoc,cAIpC,CAAAlb,IAAA,mBAAAC,MAOA,SAAkB6R,EAAM/N,EAAI0nC,EAAWC,GAChCA,IACHA,EAAapR,GAAYY,mBAEvBp8B,KAAK0kC,UACF/1B,EAAAA,oBAAoBqE,EAAMhT,KAAK0kC,SACpC1kC,KAAK0kC,QAAU,IAEZv9B,EAAAA,YAAY6L,EAAM25B,GACnB1nC,GAAMA,IAAO+N,GAAQhT,KAAK6sC,WACvBl+B,EAAAA,oBAAoB1J,EAAIjF,KAAK6sC,UAClC7sC,KAAK6sC,SAAW,GACX1lC,EAAAA,YAAYlC,EAAI2nC,GACrB3nC,EAAG8jB,gBAAgBoE,OAIvB,CAAAjsB,IAAA,gBAAAC,MAIA,WAAe8D,IAAAA,EAAEtF,UAAAC,eAAAyD,IAAA1D,UAAA,GAAAA,UAAG,GAAAK,KAAKX,OAAO2/B,iBACtBhsB,EAAgBhT,KAAhBgT,KAAMnB,EAAU7R,KAAV6R,MACH,UAAP5M,GAAyB,UAAPA,IACpBA,EAAKjF,KAAKiF,IAEPA,IACE+N,EAAAA,GAEPhT,KAAKmjC,kBAAoB,CACvBK,IAAK1tB,EAAKnG,YACVkxB,KAAM/qB,EAAK/F,cAGb/P,KAAKgjC,cAAgB/9B,EAIrBjF,KAAKwiC,gBAAkB,MACjBD,IAAAA,EAASzsB,EAAKhI,kBAChBy0B,GAAAA,IAAWviC,KAAKgjC,cAElB,OADAhjC,KAAK0jC,qBACExf,QAAQC,UAEb,IACF,IAAA,IAASxiB,EAAI,EAAGA,EAAIsrB,GAAmBrtB,OAAQ+B,IAAK,CAClD,IAAMT,EAAM+rB,GAAmBtrB,GAC/B,GAAIsD,EAAG/D,GAAM,CACLgO,IAAAA,EACI,4BAARhO,EACI+D,EAAG6nC,wBAAwBnuC,OAAOqyB,QAAQ+b,sBAC1C9nC,EAAG/D,KACLgO,OAAAA,GAAOA,EAAIqe,KACNre,EAEAgV,QAAQC,WAIjBtS,OAAAA,EAAMm7B,mBAAqBn7B,EAAMo7B,0BACnCp7B,EAAMq7B,wBACChpB,QAAQC,WAEVD,QAAQkV,OAAO,IAAItE,MAAM,kCACzBzuB,GACP,OAAO6d,QAAQkV,OAAO,IAAItE,MAAM,+BAIpC,CAAA5zB,IAAA,iBAAAC,MAIA,SAAgB8D,GAId,GAHIjF,KAAKskC,oBACPtkC,KAAKmtC,uBAEFntC,KAAKgjC,eAAkBltB,EAAKhI,kBAAjC,CAGQkF,KAAAA,SAAMnB,EAAU7R,KAAV6R,MAId7R,KAAKwiC,gBAAkB,OACnB,IACF,IAAA,IAAS7gC,EAAI,EAAGA,EAAIurB,GAAoBttB,OAAQ+B,IAAK,CACnD,IAAMT,EAAMgsB,GAAoBvrB,GAChC,GAAI2D,SAASpE,GAAM,CACXgO,IAAAA,EAAM5J,SAASpE,KACjBgO,OAAAA,GAAOA,EAAIqe,MACbre,EAAIgf,OAAM,eACHhf,GAEAgV,QAAQC,WAIjBtS,GAAAA,GAASA,EAAMo7B,yBAA0B,CACrC/9B,IAAAA,EAAM2C,EAAMu7B,uBAIlB,OAHGl+B,GAAOA,EAAIgf,OACZhf,EAAIgf,OAAM,eAELhK,QAAQC,UAEjB,OAAOD,QAAQkV,OAAO,IAAItE,MAAM,mCACzBzuB,GACP,OAAO6d,QAAQkV,OAAO,IAAItE,MAAM,iCAIpC,CAAA5zB,IAAA,mBAAAC,MAIA,WAAkB8D,IAAAA,EAAEtF,UAAAC,eAAAyD,IAAA1D,UAAA,GAAAA,UAAG,GAAAK,KAAKX,OAAO2/B,iBAC7Bh/B,KAAKskC,mBACPtkC,KAAKmtC,uBACIntC,KAAKijC,YACdjjC,KAAKmsC,iBAEP,IAAMkB,EAASpoC,KAAE7E,OACVo7B,GAAYa,iBAAgBj8B,KAAAA,OAAIo7B,GAAYS,gBAC/CT,GAAYS,eAChBj8B,KAAKkjC,gBAAgBljC,KAAKgT,KAAM/N,EAAIooC,GACpCC,IAAAA,EAA4BttC,KAAKX,OAAzB4jC,WAAAA,OAAU,IAAAqK,EAAG,GAAEA,EACjBC,GAC4B,IAAhCtK,EAAWsK,kBAC6B,mBAAhCtK,EAAWsK,kBACjBtK,EAAWsK,mBACXA,IACFvtC,KAAKijC,YAAa,EACbloB,KAAAA,KAAKtB,IAA0B,IAEtCzZ,KAAKwkC,iBAAmBv/B,EACxBjF,KAAKojC,eAAgB,EAChBroB,KAAAA,KAAKtB,IAA8B,KAG1C,CAAAvY,IAAA,oBAAAC,MAIA,WACE,IAAMksC,EAASrtC,KAAKwkC,iBAAgBpkC,GAAAA,OAC7Bo7B,GAAYa,iBAAgBj8B,KAAAA,OAAIo7B,GAAYS,gBAC/CT,GAAYS,eACZ,GAACj8B,KAAKijC,WAEH,CACLuK,IAAAA,EAA4BxtC,KAAKX,OAAzB4jC,WAAAA,OAAU,IAAAuK,EAAG,GAAEA,GAEW,IAAhCvK,EAAWsK,kBAC6B,mBAAhCtK,EAAWsK,kBACjBtK,EAAWsK,oBAEbvtC,KAAKyjC,iBAAiBzjC,KAAKgT,KAAMhT,KAAKwkC,iBAAkB6I,GACxDrtC,KAAKijC,YAAa,EACbloB,KAAAA,KAAKtB,IAA0B,IAEpCzZ,KAAKmH,YAAYkmC,QAZnBrtC,KAAKyjC,iBAAiBzjC,KAAKgT,KAAMhT,KAAKwkC,iBAAkB6I,GAe1DrtC,KAAKwkC,iBAAmB,KACxBxkC,KAAKojC,eAAgB,EAChBroB,KAAAA,KAAKtB,IAA8B,KAG1C,CAAAvY,IAAA,sBAAAC,MAIA,WAAqB8D,IAAAA,EAAEtF,UAAAC,eAAAyD,IAAA1D,UAAA,GAAAA,UAAG,GAAAK,KAAKX,OAAO2/B,iBAChCh/B,KAAKojC,eACPpjC,KAAKqjC,kBAAkBp+B,GAEzB,IAAMooC,EAASpoC,KAAE7E,OACVo7B,GAAYa,iBAAgBj8B,KAAAA,OAAIo7B,GAAYU,mBAC/CV,GAAYU,kBACX8G,KAAAA,cAAgB/9B,GAAMjF,KAAKgT,KAChChT,KAAKkjC,gBACHljC,KAAKgT,KACL/N,EACAooC,EACA7R,GAAYW,0BAEdn8B,KAAKskC,oBAAqB,EAC1BtkC,KAAKijC,YAAa,EAClBjjC,KAAKytC,aAAa,IAClBztC,KAAK0tC,WAAa1tC,KAAKgT,KAAKnM,aAAa,SACzC,IAAM8mC,EAA8C,KAAjCxpC,KAAK0P,IAAIlV,OAAOivC,cAA8D,KAAvCzpC,KAAK0P,IAAIg6B,OAAOD,YAAYE,OAEtF9tC,KAAKgT,KAAKhG,MAAMN,MAAkBtM,GAAAA,OAAVutC,EAAgBhvC,OAAOovC,WAAoBpvC,OAAOqvC,YAAjB5tC,MACpD2a,KAAAA,KAAKtB,IAA0B,KAGtC,CAAAvY,IAAA,uBAAAC,MAIA,SAAsB8D,GACpB,IAAMooC,EACJrtC,KAAKgjC,gBAAkBhjC,KAAKgT,KAAI,GAAA5S,OACzBo7B,GAAYa,iBAAgBj8B,KAAAA,OAAIo7B,GAAYU,mBAC/CV,GAAYU,kBAClBl8B,KAAKyjC,iBACHzjC,KAAKgT,KACLhT,KAAKgjC,cACLqK,EACA7R,GAAYW,0BAEdn8B,KAAKskC,oBAAqB,EAC1BtkC,KAAKijC,YAAa,EAClBjjC,KAAKytC,aAAa,GACb1yB,KAAAA,KAAKtB,IAA0B,GAChCzZ,KAAK0tC,aACF16B,KAAAA,KAAKhG,MAAMA,MAAQhN,KAAK0tC,WAC7B1tC,KAAK0tC,YAAa,KAErB,CAAAxsC,IAAA,eAAAC,MAED,SAAc8sC,GACe,KAAvBtvC,OAAOivC,cAAkD,KAA5BjvC,OAAOivC,YACtC5tC,KAAKqkC,UAAY,EAEjBrkC,KAAKqkC,UAAY4J,IAIrB,CAAA/sC,IAAA,QAAAC,MAQA,WACEypB,IAAAA,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CACLghC,UAAW3gC,KAAKX,OAAOy+B,eACvBoQ,MAAOluC,KAAKX,OAAOw/B,UAGjB7+B,KAAK0c,SACP1c,KAAKmuC,QAAQvjB,GAGV7P,KAAAA,KAAKtB,EAAmB8W,EAAA,CAC3BlL,OAAQrlB,KAAKqlB,OACbhQ,MAAOrV,KAAKqV,OACTuV,MAIP,CAAA1pB,IAAA,OAAAC,MAIA,WAAMypB,IAAAA,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAE0hC,cAAc,GACtBrhC,KAAK0c,UAIV1c,KAAKouC,kBACArzB,KAAAA,KAAKtB,EAAkB8W,EAAA,CAC1BlL,OAAQrlB,KAAKqlB,OACbhQ,MAAOrV,KAAKqV,OACTuV,KAPH5qB,KAAKquC,OAAOzjB,KAWhB,CAAA1pB,IAAA,UAAAC,MAKA,WAAiD,IAAAmtC,EAAAtuC,KAAxC4qB,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEghC,UAAU,EAAMuN,MAAO,KAC/BrI,EAAgB7lC,KAAhB6lC,YAOR,GANA7lC,KAAK0c,UAAW,EACXvV,KAAAA,YAAYq0B,GAAYO,UAC7B/7B,KAAKouC,uBACe/qC,IAAhBunB,EAAK2jB,SACP1I,EAAYC,eAAiBlb,EAAK2jB,SAEd,IAAlB3jB,EAAK+V,WAAsC,IAAhB/V,EAAK2jB,QAAmB1I,EAAYC,eACjE9lC,KAAKouC,sBADP,CAIA,IAAMlrC,EAAO0nB,GAAQA,EAAKsjB,MAAQtjB,EAAKsjB,MAAQluC,KAAKX,OAAOw/B,SAC3D7+B,KAAK6jC,UAAY/tB,EAAKrS,WAAWzD,MAAM,WACrCsuC,EAAKzK,UAAY,KACjByK,EAAKlN,SACJl+B,MAGL,CAAAhC,IAAA,SAAAC,MAKA,WAAuC,IAAAqtC,EAAA7uC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAJ,GAAE8uC,EAAAD,EAA3BnN,aAAAA,OAAe,IAAHoN,GAAQA,EACxB,IAAAzuC,KAAK6lC,YAAYC,eAAjB,CAGI7H,IAAAA,EAAyBj+B,KAAKX,OAA9B4+B,qBACRj+B,KAAK0c,UAAW,GACZ2kB,GAAgBpD,IAA0Bj+B,KAAKqlB,SAAWrlB,KAAKqV,QAC5DjP,KAAAA,SAASo1B,GAAYO,aAE7B,CAAA76B,IAAA,YAAAC,MAiGD,WACEnB,KAAKisC,UAAU,aAGjB,CAAA/qC,IAAA,YAAAC,MAGA,WACOgG,KAAAA,YAAYq0B,GAAYG,OACxBx0B,KAAAA,YAAYq0B,GAAYnlB,OACxBlP,KAAAA,YAAYq0B,GAAYzjB,SAC7B/X,KAAKokC,WAAY,EACjBpkC,KAAK8jC,WAAahuB,EAAKnR,aAAa3E,KAAMA,KAAK8jC,aAChD,CAAA5iC,IAAA,eAAAC,MAED,WAAgB,IAAAutC,EAAA1uC,KACdA,KAAKkkC,SAAU,EACflkC,KAAKmkC,WAAY,EACbnkC,KAAKgiC,YAAc,IACjBhiC,KAAK6S,SAAW,EAClB7S,KAAKiiC,mBAIAtoB,KAAAA,KAAKF,GAAwB,WAChCi1B,EAAKzM,yBAIZ,CAAA/gC,IAAA,cAAAC,MAED,WACOgG,KAAAA,YAAYq0B,GAAYnlB,OAC7BrW,KAAKokC,WAAY,IAGnB,CAAAljC,IAAA,SAAAC,MAGA,WACMnB,KAAK0mC,QAAUtG,IACZmG,KAAAA,SAASnG,IAEXj5B,KAAAA,YAAYq0B,GAAYI,QAC7B57B,KAAKqV,OAASrV,KAAKmH,YAAYq0B,GAAYrlB,QAC1CnW,KAAKX,OAAO2+B,qBAAuBh+B,KAAK0gC,UAG3C,CAAAx/B,IAAA,UAAAC,MAGA,WACOiF,KAAAA,SAASo1B,GAAYI,QAC1B57B,KAAKisC,UAAU,SACVjsC,KAAKX,OAAO4+B,uBACfj+B,KAAKouC,kBACLpuC,KAAK0gC,WAIT,CAAAx/B,IAAA,UAAAC,MAGA,WACEnB,KAAKisC,UAAU,SACV7lC,KAAAA,SAASo1B,GAAYrlB,OACrBowB,KAAAA,SAASnG,MAIhB,CAAAl/B,IAAA,UAAAC,MAGA,WAEEnB,KAAKkkC,SAAU,EACflkC,KAAKisC,UAAU,SACV9kC,KAAAA,YAAYq0B,GAAYmB,oBACxBx1B,KAAAA,YAAYq0B,GAAYK,UACxB10B,KAAAA,YAAYq0B,GAAYG,OACxBx0B,KAAAA,YAAYq0B,GAAYzjB,SACxB3R,KAAAA,SAASo1B,GAAYnlB,SAG5B,CAAAnV,IAAA,YAAAC,MAGA,WACOnB,KAAKmkC,WACRnkC,KAAKisC,UAAU,WAEjBjsC,KAAKmkC,WAAY,EACZ/9B,KAAAA,SAASo1B,GAAYllB,WAG5B,CAAApV,IAAA,WAAAC,MAGA,WACEnB,KAAKmkC,WAAY,EAEbnkC,KAAK8jC,WACFn/B,EAAAA,aAAa3E,KAAMA,KAAK8jC,WAE1B38B,KAAAA,YAAYq0B,GAAYzjB,SACxB5Q,KAAAA,YAAYq0B,GAAYllB,WAG/B,CAAApV,IAAA,YAAAC,MAGA,WAAa,IAAAwtC,EAAA3uC,KACPA,KAAK8jC,WACFn/B,EAAAA,aAAa3E,KAAMA,KAAK8jC,WAE/B9jC,KAAKisC,UAAU,WACfjsC,KAAK8jC,UAAYhuB,EAAKrS,WAAWzD,MAAM,WAChCoG,EAAAA,SAASo1B,GAAYzjB,SAC1B42B,EAAK5zB,KAAKtB,IACL9U,EAAAA,aAAagqC,EAAMA,EAAK7K,WAC7B6K,EAAK7K,UAAY,OAChB9jC,KAAKX,OAAOwgC,gBAGjB,CAAA3+B,IAAA,YAAAC,MAGA,WAAa,IAAAytC,EAAA5uC,KACXA,KAAKkkC,SAAU,EAEC,CAD4C1I,GAApDK,SAAoDL,GAA1CI,OAA0CJ,GAAlCrlB,MAAkCqlB,GAA3BnlB,MAA2BmlB,GAApB/jB,OAAoB+jB,GAAZzjB,SAExCnS,SAAQ,SAAC4lC,GACfoD,EAAKznC,YAAYqkC,MAEdxrC,KAAKklC,WAAWjO,GAAMj3B,KAAKqlB,QAAWrlB,KAAKqV,QAC9CrV,KAAKklC,WAAWjO,GAAI,IAAInzB,MAAOsO,aAInC,CAAAlR,IAAA,eAAAC,MAGA,YACGnB,KAAK2kC,cAAgB3kC,KAAK6R,MAAM8Y,aAAe3qB,KAAKk4B,UAChDl4B,KAAK8jC,WAAa9jC,KAAKsG,SAASk1B,GAAYzjB,WAC/C/X,KAAK6R,MAAM0D,WAAa,IAEnBpO,KAAAA,YAAYq0B,GAAYzjB,SACxBpT,EAAAA,aAAa3E,KAAMA,KAAK8jC,WAC7B9jC,KAAK8jC,UAAY,OAId9jC,KAAKqlB,QAAUrlB,KAAK0mC,QAAUtG,IAAmBpgC,KAAK6S,WACpD0zB,KAAAA,SAASnG,IACdpgC,KAAK+a,KAAKtB,KAGPzZ,KAAKklC,WAAWjO,GAAMj3B,KAAKqlB,QAAWrlB,KAAKqV,QAC9CrV,KAAKklC,WAAWjO,GAAI,IAAInzB,MAAOsO,aAElC,CAAAlR,IAAA,iBAAAC,MAED,WACsC,WAA/BuG,EAAAA,OAAO1H,KAAKX,OAAOomB,UACrBzlB,KAAKX,OAAOomB,OAASzlB,KAAKylB,UAC9B,CAAAvkB,IAAA,eAAAC,MAED,WACO9B,KAAAA,OAAOkoB,oBAAsBvnB,KAAK8lB,eAGzC,CAAA5kB,IAAA,iBAAAC,MAOA,SAAgBqI,EAAO4mB,EAAQC,GAC7B,GAAKrwB,KAAK6R,OAAUue,GAAW5mB,EAA/B,CAGMmsB,IAAAA,EACmB,WAAvB7f,EAAKpO,OAAO8B,GAAsBA,EAAQA,EAAM1H,MAAQ,GAOtDuuB,EAAOoS,OAAuC,UAA9B3sB,EAAKpO,OAAO2oB,EAAOoS,SAC9BA,EAAAA,MAAQ,CAACpS,EAAOoS,QAEpB1nB,KAAAA,KAAKtB,GAAkB8W,EAAA,CAC1BoF,UAAAA,EACAvF,OAAAA,EAEAlc,YAAalU,KAAKkU,YAClBrB,SAAU7S,KAAK6S,SACfwC,MAAOrV,KAAKqV,MACZ7L,MAAAA,GACG6mB,OAEN,CAAAnvB,IAAA,YAAAC,MAED,SAAW0tC,GACL,GAAA7uC,KAAKklC,WAAWjO,EAAG,CACrB,IAAM6X,GAAM,IAAIhrC,MAAOsO,UAAYpS,KAAKklC,WAAWjO,EACnDj3B,KAAKklC,WAAWC,KAAO2J,EACvB9uC,KAAKklC,WAAWjO,EAAI,GACJ,UAAZ4X,GAAuB7uC,KAAKqV,SACzB6vB,KAAAA,WAAWE,QAAUplC,KAAKklC,WAAWC,QAKhD,CAAAjkC,IAAA,cAAAC,MAQA,SACE+B,GACAf,IAAAA,EAAOxC,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CACRovC,UAAW,EACXC,QAAS,GAEXC,EAAuC9sC,GAAW,GAAE+sC,EAAAD,EAA5CF,UAAAA,OAAY,IAAHG,EAAG,EAACA,EAAAC,EAAAF,EAAED,QAAAA,OAAU,IAAHG,EAAG,EAACA,EAC5B9+B,EAAWrQ,KAAK6R,MAAMxB,SAC5B,IAAKA,GAAgC,IAApBA,EAASzQ,SAAiBI,KAAK6S,SACvC,OAAA,EAIT,IAFA,IAAMqB,EAAchR,GAAQlD,KAAK6R,MAAMqC,aAAe,GAChDtS,EAAMyO,EAASzQ,OACZ+B,EAAI,EAAGA,EAAIC,EAAKD,IACnB0O,GAAAA,EAAShP,MAAMM,GAAKotC,GAAa76B,GAAe7D,EAAS/O,IAAIK,GAAKqtC,EAAU96B,EACvE,OAAA,EAGJ,OAAA,IACR,CAAAhT,IAAA,iBAAAC,MAED,WAAkB,IAAAiuC,EAAApvC,KAChBqvC,EAAyBrvC,KAAK6kC,SAAtBE,EAAEsK,EAAFtK,GAAIC,EAAEqK,EAAFrK,GAAIn4B,EAACwiC,EAADxiC,EAAGD,EAACyiC,EAADziC,EACfyG,EAASrT,KAAK6kC,SAASxxB,OAC3B,KAAIA,EAAS,GAAKxG,EAAI,GAAKD,EAAI,GAA/B,CAGI0iC,IAAAA,EAAMtvC,KAAK6kC,SAASyK,IAIxB,IAHKA,GAAOtvC,KAAK6R,MAAM8Y,cACrB2kB,EAAMtvC,KAAK6R,MAAM6Y,WAAa1qB,KAAK6R,MAAM8Y,YAAc,KAEpD2kB,EAAL,CAGAtvC,KAAK6kC,SAASC,GAAKwK,EAEnB,IAAMC,EAAO,CACXl8B,OAFOA,EAAAA,EAAS,EAAI,EAAIA,GAItBnJ,EAAU,EACVJ,EAAU,EACVsJ,EAAQ,EACN+J,EAAKhZ,KAAK0P,IAAIR,EAAS,IACrBL,EAAyBhT,KAAzBgT,KAAMsyB,EAAmBtlC,KAAnBslC,eACR54B,EAAQsG,EAAKw8B,YACb7iC,EAAS24B,EAAiBA,EAAemK,aAAez8B,EAAKy8B,aAC7Dl8B,EAAS,GACXm8B,EAAU/iC,EACVgjC,EAASjjC,EAETyQ,GAAAA,EAAK,GAAM,EACb/J,EAAQvG,EAAI,EAAI,IAAMA,EAAKD,EAAI,EAAI,IAAMA,EAAI,EAC7C2iC,EAAKn8B,MAAQA,EACblJ,EAAU66B,EAAK,GAAK,IAAMl4B,GAAK,EAAIk4B,EAAK,EACxCwK,EAAKx+B,EAAW,IAAPoM,EAAW,EAAIjT,EAAUA,EAClCJ,EAAUk7B,EAAK,GAAK,IAAMp4B,GAAK,EAAIo4B,EAAK,EACxCuK,EAAKz+B,EAAW,IAAPqM,EAAW,EAAIrT,EAAUA,EAClCyJ,EAAO7G,MAAK,GAAAtM,OAAMuvC,EAAU,MAC5Bp8B,EAAO5G,OAAM,GAAAvM,OAAMsvC,EAAW,MAC9Bn8B,EAAOq8B,SAAW,GAClBr8B,EAAOs8B,UAAY,QACrB,GAAW1yB,EAAK,GAAM,EAAG,CAEbzQ,EAAAA,EACV,IAAM2H,EAAS1H,EAASD,EACd5C,GAACuK,EAAS,GAHX1H,EAAAA,GAGwB,IACjC4iC,EAAKz+B,EAAW,IAAPqM,EAAWrT,EAAUi7B,EAAK,EAAIj7B,EAAUi7B,EAAK,EAC5C1wB,EAAAA,EAAS,EAAIq7B,EAAU,IACjCH,EAAKx+B,EAAW,IAAPoM,EAAWjT,EAAU86B,EAAK,EAAI96B,EAAU86B,EAAK,EACtDuK,EAAKn8B,MAAQA,EACbG,EAAO7G,MAAK,GAAAtM,OAAMuvC,EAAU,MAC5Bp8B,EAAOq8B,SAAQ,GAAAxvC,OAAMuvC,EAAU,MAC/Bp8B,EAAO5G,OAAM,GAAAvM,OAAMsvC,EAAW,MAC9Bn8B,EAAOs8B,UAAS,GAAAzvC,OAAMsvC,EAAW,MAE7BI,IAAAA,EAAYh6B,EAAK5C,kBAAkBq8B,EAAMvvC,KAAK6R,MAAM7E,MAAM+iC,WAAa/vC,KAAK6R,MAAM7E,MAAMgjC,iBAC9Fz8B,EAAOw8B,UAAYD,EACnBv8B,EAAOy8B,gBAAkBF,EAEzBpqC,OAAOC,KAAK4N,GAAQ3L,KAAI,SAAA1G,GACjB2Q,EAAAA,MAAM7E,MAAM9L,GAAOqS,EAAOrS,UAInC,CAAAA,IAAA,WAAAC,MAKA,WAAUgS,IAAAA,EAAGxT,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEkN,EAAG,EAAGkE,EAAG,EAAGD,EAAG,EAAGlE,EAAG,GACrC,GAAK5M,KAAK6R,OAAUsB,GAAQA,EAAItG,EAAhC,CAGA,IAAQg4B,EAAa7kC,KAAb6kC,SACCh4B,EAAAA,EAAY,IAARsG,EAAItG,GAAW,EACnBD,EAAAA,EAAY,IAARuG,EAAIvG,GAAW,EACnBo4B,EAAAA,GAAa,IAAR7xB,EAAIrC,GAAW,EACpBi0B,EAAAA,GAAa,IAAR5xB,EAAIpC,GAAW,EAC7B/Q,KAAKiwC,oBAGP,CAAA/uC,IAAA,YAAAC,MAIA,SAAW9B,GAAQ,IAAA6wC,EAAAlwC,KACZX,GAGLqG,OAAOC,KAAKtG,GAAQuI,KAAI,SAAC1G,GACvB,GAAY,YAARA,EAAmB,CAChB7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,GAC1B,IAAMytB,EAASuhB,EAAKxhB,QAAQxtB,EAAIwgB,eAC5BiN,GAA4C,aAAlC7Y,EAAKpO,OAAOinB,EAAOwhB,YACxBA,EAAAA,UAAU9wC,EAAO6B,UAMhC,CAAAA,IAAA,WAAAC,MAIA,SAAU9B,GAAQ,IAAA+wC,EAAApwC,KAChBA,KAAK4rC,aACL5rC,KAAKmwC,UAAU9wC,GACfW,KAAK4lB,aAAe,EACpB5lB,KAAK+lB,UAAY,EACRiI,GAAAhuB,KAAM,YAAY,WACzBowC,EAAK/uC,QACA0Z,EAAAA,KAAKtB,GAAiBpa,QAE9B,CAAA6B,IAAA,SAAAC,MAED,WAAU,IAAAkvC,EAAArwC,KACR,GAAKA,KAAK6R,OAAU7R,KAAKgT,KAAzB,CAGMs9B,IAAAA,EAAgBtwC,KAAKgT,KAAKu0B,wBAC3BtC,KAAAA,SAASv4B,MAAQ4jC,EAAc5jC,MAC/Bu4B,KAAAA,SAASt4B,OAAS2jC,EAAc3jC,OAChCs4B,KAAAA,SAASpE,KAAOyP,EAAczP,KAC9BoE,KAAAA,SAASzB,IAAM8M,EAAc9M,IAClC,IAAA+M,EAAoCvwC,KAAK6R,MAAjC6Y,EAAU6lB,EAAV7lB,WAAYC,EAAW4lB,EAAX5lB,YACpB6lB,EAAwCxwC,KAAKX,OAArC69B,EAAYsT,EAAZtT,aAAcC,EAAaqT,EAAbrT,cAMlB,GAJkB,SAAlBA,GAA8C,UAAlBA,GAA+C,YAAlBA,GACtDr3B,KAAAA,aAAa,cAAeq3B,GAG9BxS,GAAgBD,EAAjB,CAGJ1qB,KAAK2kC,aAAeha,EACpB3qB,KAAK4kC,YAAcla,EACb+lB,IAAAA,EACJzwC,KAAKwmB,UAAYxmB,KAAKslC,eAClBtlC,KAAKwmB,SAASxT,KAAKu0B,wBAAwB56B,OAC3C,EACAD,EAAQ4jC,EAAc5jC,MACtBC,EAAS2jC,EAAc3jC,OAAS8jC,EAChCC,EAAW7iC,SAAU6c,EAAaC,EAAe,IAAM,IACvDgmB,EAAM9iC,SAAUnB,EAAQC,EAAU,IAAM,IAC1CgjC,EAASjjC,EACTgjC,EAAU/iC,EACRikC,EAAS,GAEK,SAAjB1T,GAA2ByT,EAAMD,GACjB,aAAjBxT,GAEAwS,EAAWhjC,EAAQgkC,EAAY,IAC3B1wC,KAAKX,OAAO49B,MACd2T,EAAOC,WAAU,GAAAzwC,OAAiB,IAAVsvC,EAAiBC,EAAS,KAElDiB,EAAOjkC,OAAMvM,GAAAA,OAAMsvC,EAAUe,EAAkB,QAG/B,SAAjBvT,GAA2ByT,EAAMD,GACjB,cAAjBxT,KAEAyS,EAAUe,EAAW/jC,EAAU,IAC/BikC,EAAOlkC,MAAK,GAAAtM,OAAMuvC,EAAU,OAGzB3vC,KAAKijC,YAAejjC,KAAKojC,eAC5B19B,OAAOC,KAAKirC,GAAQhrC,SAAQ,SAAC1E,GACtB8R,EAAAA,KAAKhG,MAAM9L,GAAO0vC,EAAO1vC,OAKb,eAAlBi8B,GAAkCwT,EAAMD,GACtB,cAAlBvT,GAAiCwT,EAAMD,IAEnC5qC,KAAAA,aAAa,cAAe,SAEnC,IAAM8kB,EAAO,CACXkmB,WAAYJ,EACZK,OAAQpB,EACRqB,QAAStB,EACTuB,OAAQtB,EACRuB,QAASxB,EAAUe,GAErBzwC,KAAKiwC,iBACAl1B,KAAAA,KAAKtB,GAAqBmR,OAGjC,CAAA1pB,IAAA,uBAAAC,MAMA,WAAsB0/B,IAAAA,EAAIlhC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAAG6jC,EAAG7jC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAChCK,KAAK6R,MAAMs/B,qBACRt/B,KAAAA,MAAMs/B,qBAAqBtQ,EAAM2C,GAGxCxjC,KAAK6R,MAAM7E,MAAMokC,kBAAchxC,OAAa,IAAPygC,EAAUzgC,MAAAA,OAAW,IAANojC,EAAY,OAGlE,CAAAtiC,IAAA,WAAAC,MAIA,SAAUkwC,GACRjyC,EAASG,QACP,yBAAUa,OACIigC,GAAYrgC,KAAK0mC,eAAMtmC,OAAOigC,GAAYgR,KAE1DrxC,KAAKgkC,OAASqN,IAGhB,CAAAnwC,IAAA,gBAAAC,MAOA,SAAe8J,EAAKgK,GAClB,IAAAq8B,EAAgDtxC,KAAKX,OAA7Cq/B,EAAa4S,EAAb5S,cAAe6S,EAAoBD,EAApBC,qBACjBC,EAAoB9rC,OAAO6gB,OAAO,GAAIgrB,EAAsBt8B,GAC3D,OAACa,EAAK9D,OAAO/G,IAAiC,mBAAlByzB,EAAuE,CAAEzzB,IAAAA,GAA1CyzB,EAAczzB,EAAKumC,KAIvF,CAAAtwC,IAAA,mBAAAC,MAGA,WACMnB,KAAKgiC,YAAc,GAAKhiC,KAAK6S,SAAW,IAC1C7S,KAAKkU,YAAclU,KAAKgiC,YAAchiC,KAAK6S,SAAW7S,KAAK6S,SAAW7S,KAAKgiC,YAC3EhiC,KAAKgiC,aAAc,KAIvB,CAAA9gC,IAAA,QAAAK,IAGA,WACE,OAAOvB,KAAKgkC,SAGd,CAAA9iC,IAAA,eAAAK,IAGA,WACE,OAAOvB,KAAKijC,aAGd,CAAA/hC,IAAA,kBAAAK,IAGA,WACE,OAAOvB,KAAKojC,gBAGd,CAAAliC,IAAA,WAAAK,IAIA,WACE,OAAOvB,KAAKqmB,WACboD,IAED,SAAcgoB,GACQ,kBAATA,IACTzxC,KAAKqmB,UAAYorB,GACJ,IAATA,GACGlL,KAAAA,SAASnG,IAEhBpgC,KAAK+a,KAAK,eAId,CAAA7Z,IAAA,YAAAK,IAIA,WACE,OAAOvB,KAAKgkC,SAAW5D,IAAkBpgC,KAAKgkC,SAAW5D,IAC1D3W,IAED,SAAetoB,GACTA,EACGolC,KAAAA,SAASnG,IAEdpgC,KAAKgkC,QAAU5D,IAAmBpgC,KAAKumC,SAASnG,MAIpD,CAAAl/B,IAAA,iBAAAK,IA2BA,WACE,OAAKvB,KAAKX,QAAWW,KAAKX,OAAOmgC,YAG1Bx/B,KAAKX,OAAOmgC,WAAW99B,MAFrB,IAKX+nB,IA/BA,SAAoB/nB,GAAM,IAAAgwC,EAAA1xC,KAChBw/B,EAAex/B,KAAKX,OAApBmgC,WACJmS,EAAS,KACTC,EAAY,KAEhBpS,EAAW99B,KAAOA,EACbqZ,KAAAA,KAAK,gBAAiBrZ,GAEtBkE,EAAAA,SAAQ,SAACC,GAASgsC,IAAAA,GACCA,QAAlBA,EAAAH,EAAKjN,qBAALoN,IAAkBA,OAAlBA,EAAAA,EAAoBrS,cAAe35B,EAAK25B,aACjC35B,EAAAA,GAEP25B,EAAW0G,oBAAsBrgC,EAAK25B,aAC5B35B,EAAAA,OAGX+rC,GAAalwC,EAAK9B,OAAS,IAC9BgyC,EAAYlwC,EAAK,IAEnBiwC,EACI3xC,KAAK8xC,iBAAiBH,GACtBC,GAAa5xC,KAAK8xC,iBAAiBF,KACxC,CAAA1wC,IAAA,iBAAAK,IAmBD,WACE,IAAM2N,EAAM,CACV6iC,MAAO,EACPC,QAAS,EACTC,UAAW,EACXC,YAAa,EACbC,gBAAiB,GAEnB,IAAKnyC,KAAK6R,QAAU7R,KAAK6R,MAAMugC,wBACtBljC,OAAAA,EAEHmjC,IAAAA,EAAWryC,KAAK6R,MAAMugC,0BAWrBljC,OAVH8iC,EAAAA,QAAUK,EAASC,oBAAsB,EACzCP,EAAAA,MAAQM,EAASE,kBAAoB,EACrCN,EAAAA,UAAYI,EAASG,sBAAwB,EAC7CtjC,EAAI6iC,MAAQ,IACd7iC,EAAIgjC,YAAehjC,EAAI8iC,QAAU9iC,EAAI6iC,MAAS,IAC1CI,EAAAA,gBAAkBtkC,SACnB7N,KAAKyyC,aAAevjC,EAAI6iC,MAAS7iC,EAAI8iC,QACtC,IAGG9iC,IAGT,CAAAhO,IAAA,OAAAK,IAeA,WACE,OAAOvB,KAAKX,OAAO0d,MACpB0M,IAdD,SAAU1M,GAEc,IADPyD,GAAKxD,SAASgF,QAAO,SAAC9gB,GAAG,OAAKA,IAAQ6b,KAC1Cnd,QAAyB,OAATmd,GAM3B/c,KAAKX,OAAO0d,KAAOA,EACJge,GAAAA,QAAQhe,EAAM/c,OAN3BC,QAAQhB,MAAK,+CAAAmB,OACoC2c,EAAI3c,gEAAAA,OAA+DogB,GAAKxD,SAASnV,gBAMrI,CAAA3G,IAAA,OAAAK,IAMD,WACMmxC,IAAAA,EAAK1yC,KAAKX,OAAO0d,KAIrB,MAHW,OAAP21B,IACGA,EAAA,SAEA1yC,KAAKwlC,OAAOzoB,KAAK21B,IAAO1yC,KAAKwlC,OAAOzoB,KAAKM,KACjD,CAAAnc,IAAA,WAAAK,IAED,WACS,OAAAvB,KAAKwlC,OAAOvoB,UAAY,KAGjC,CAAA/b,IAAA,UAAAK,IAGA,WACS9C,OAAAA,IAGT,CAAAyC,IAAA,WAAAK,IAGA,WACE,OAAOvB,KAAKg4B,gBAGd,CAAA92B,IAAA,MAAAK,IAUA,WACS,OAAAvB,KAAK2yC,OAAS3yC,KAAKX,OAAO4L,KAGnCwe,IAXA,SAASxe,GAIPjL,KAAK2yC,MAAQ1nC,IACd,CAAA/J,IAAA,SAAAK,IAaD,WACS,OAAAvB,KAAK0uB,QAAQ4O,OAChBt9B,KAAK0uB,QAAQ4O,OAAOj+B,OAAOi+B,OAC3Bt9B,KAAKX,OAAOi+B,QACjB7T,IARD,SAAYmpB,GACV5yC,KAAK0uB,QAAQ4O,QAAUt9B,KAAK0uB,QAAQ4O,OAAOuV,OAAOD,KACnD,CAAA1xC,IAAA,aAAAK,IAQD,WACE,OAAAupB,EAAAC,EAAA8W,EAAAt7B,WAAA,aAAAvG,QACD,CAAAkB,IAAA,QAAAK,IAED,WACE,IAAML,EAAG4pB,EAAAC,EAAA8W,EAAAt7B,WAAc,QAAAvG,MAChB,OAAAA,KAAKoV,KAAKlU,IAAQA,IAC1B,CAAAA,IAAA,eAAAK,IAED,WACE,OAAAupB,EAAAC,EAAA8W,EAAAt7B,WAAA,eAAAvG,QAGF,CAAAkB,IAAA,qBAAAK,IAGA,WACS,QAA6B,OAA3BvB,KAAKmjC,qBAGhB,CAAAjiC,IAAA,eAAAK,IAIA,WACE,IAAAuxC,EAAmB9yC,KAAKklC,WAAhBC,EAAG2N,EAAH3N,IAAKlO,EAAC6b,EAAD7b,EACb,OAAOA,GAAI,IAAInzB,MAAOsO,UAAY6kB,EAAIkO,EAAMA,IAG9C,CAAAjkC,IAAA,OAAAK,IAGA,WACE,OAAOvB,KAAKX,OAAOwR,MAGrB4Y,IAGA,SAAUtoB,GACRnB,KAAKX,OAAOwR,KAAO1P,IAGrB,CAAAD,IAAA,iBAAAK,IAaA,WACE,OAAOvB,KAAK6kC,SAASxxB,QAGvBoW,IAbA,SAAoBhb,IACZqH,EAAAA,EAAKlC,WAAWnF,IACZ,IAAO,GAAKA,IAAQzO,KAAK6kC,SAASxxB,SAG5CrT,KAAK6kC,SAASxxB,OAAS5E,EACvBzO,KAAKiwC,oBACN,CAAA/uC,IAAA,WAAAK,IAcD,WACSogC,OAAAA,IAGTlY,IARA,SAAchb,GACAA,GAAAA,IACb,CAAAvN,IAAA,gBAAAK,IAcD,WACSmgC,OAAAA,IACRjY,IAND,SAAmBhb,GACCA,GAAAA,IACnB,CAAAvN,IAAA,oBAAAK,IAMD,WACS,OAAAvB,KAAKqlC,YAAYnxB,aAAe,GACxCuV,IAED,SAAuBhb,GACrBzO,KAAKqlC,YAAYnxB,YAAczF,IAChC,CAAAvN,IAAA,iBAAAK,IAED,WACS,OAAAvB,KAAKqlC,YAAYxyB,UAAY,GACrC4W,IAED,SAAoBhb,GACb42B,KAAAA,YAAYxyB,SAAWpE,GAAO,IAErC,CAAAvN,IAAA,OAAAC,MAMA,SAAMssB,EAAUJ,GAEd,OAAOG,GAAK/mB,KAAItG,MAATqtB,IAAUxtB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAG5B,CAAAuB,IAAA,WAAAC,MAGA,WAAmB,IAAA,IAAAzB,EAAAC,UAAAC,OAANuD,EAAIrD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAJoD,EAAIpD,GAAAJ,UAAAI,GACf,OAAOiuB,GAASvnB,KAAItG,MAAb6tB,IAAchuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGhC,CAAAuB,IAAA,WAAAC,MAMA,SAAUssB,EAAUJ,GAClB,OAAOiB,GAAS7nB,KAAItG,MAAbmuB,IAActuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGhC,CAAAuB,IAAA,cAAAC,MAMA,SAAassB,EAAUJ,GACrB,OAAOkB,GAAY9nB,KAAItG,MAAhBouB,IAAiBvuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGnC,CAAAuB,IAAA,iBAAAC,MAQA,SAAgB2sB,EAAYL,EAAUJ,GAAkB,IAAA,IAAA9sB,EAAAZ,UAAAC,OAANuD,MAAIrD,MAAAS,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAb,GAAAA,UAAAa,GACpD,OAAOiuB,GAAehoB,KAAItG,MAAnBsuB,IAAoBzuB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGtC,CAAAuB,IAAA,oBAAAC,MAQA,SAAmB2sB,EAAYL,EAAUJ,GAAkB,IAAA,IAAAzsB,EAAAjB,UAAAC,OAANuD,MAAIrD,MAAAc,EAAAA,EAAAA,OAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAA,EAAAA,EAAAlB,GAAAA,UAAAkB,GACvD,OAAO+tB,GAAkBnoB,KAAItG,MAAtByuB,IAAuB5uB,MAAII,OAAAN,MAAAyG,UAAA2B,MAAAzB,KAAK9G,eAGzC,CAAAuB,IAAA,gBAAAC,MAKA,SAAeub,EAAUq2B,GAASC,IAAAA,EACT,kBAAZD,GAAyBA,IAAY/yC,KAAKwlB,QACnDxlB,KAAKizC,WAAW,gBACZn9B,EAAKpO,OAAOqrC,KAAaG,UAI3BlzC,KAAKwlB,MAAQutB,IAGN,QAAXC,EAAApR,UAAAoR,IAAWA,GAAXA,EAAa32B,UAAUrc,KAAKoc,SAAUM,MAGxC,CAAA,CAAAxb,IAAA,WAAAK,IAhmFA,WACE,OAAOnC,EAASC,OAAOC,OAGzBmqB,IARA,SAAqBtoB,GACnB/B,EAASC,OAAOC,MAAQ6B,IACzB,CAAAD,IAAA,cAAAK,IAgBD,WACSqgC,OAAAA,IAGTnY,IAXA,SAAwBtoB,GACRA,GAAAA,IACf,CAAAD,IAAA,+BAAAC,MAcD,WAAuCgyC,IAAAA,EACrC,OAAkBA,QAAlBA,EAAOvR,cAAWuR,SAAXA,EAAaC,gBAGtB,CAAAlyC,IAAA,uBAAAC,MAMA,SAA6Bib,EAAUM,GAAU22B,IAAAA,EACpC,QAAXA,EAAAzR,UAAW,IAAAyR,GAAXA,EAAah3B,UAAUD,EAAUM,KAClC,CAAAxb,IAAA,kBAAAC,MAikFD,WACE,OAAOgmB,GAAQvD,oBAGjB,CAAA1iB,IAAA,uBAAAC,MAMA,SAA6BnC,GACpBmoB,OAAAA,GAAQtD,qBAAqB7kB,KAGtC,CAAAkC,IAAA,UAAAC,MAIA,SAAgBuK,EAAM4nC,GACfzR,EAAOnT,UACVmT,EAAOnT,QAAU,IAEdmT,EAAOnT,QAAQhjB,KAClBm2B,EAAOnT,QAAQhjB,GAAQ4nC,KAI3B,CAAApyC,IAAA,MAAAC,MAIA,SAAYuK,EAAM4nC,GACXzR,EAAOnT,UACVmT,EAAOnT,QAAU,IAEnBmT,EAAOnT,QAAQhjB,GAAQ4nC,MACxBzR,GAppFkB1b,IAAf0b,EAAAA,GAAM,gBAspFa,MAtpFnBA,EAAAA,GAAM,eA2pFY,MAIjBD,GAAAA,YAAc7lB,GAAYw3B,cC1sFZC,IAAAA,YAAIjT,GAAAtkB,EAAAu3B,EAAAjT,GAAArkB,IAAAA,EAAAC,EAAAq3B,GAAA,SAAAA,IAAAptB,IAAAA,EAAAplB,OAAAwyC,GAAA,IAAA,IAAA9zC,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAmBtBqmB,OAnBsB6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KASP,iBAAA,SAACwD,GACfyf,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,gBAEpB7F,EAAAuY,EAAApa,GAEe,iBAAA,SAACzf,GACfyf,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,gBAEpB1H,EAKAotB,OALAvyC,EAAAuyC,EAAA,CAAA,CAAAtyC,IAAA,cAAAC,MAlBD,WACO8K,KAAAA,KAAK,aAAcjM,KAAKyzC,eACxBxnC,KAAAA,KAAK,aAAcjM,KAAK0zC,eACzB1zC,KAAKX,OAAOm2B,SACdx1B,KAAKw1B,YAER,CAAAt0B,IAAA,UAAAC,MAcD,WACOmgC,KAAAA,OAAO,aAActhC,KAAKyzC,eAC1BnS,KAAAA,OAAO,aAActhC,KAAK0zC,mBAChCF,GAxB+Bxf,i8BCeb2f,YAAaC,GAAA33B,EAAA03B,EAAAC,GAAA13B,IAAAA,EAAAC,EAAAw3B,GAAA,SAAAA,IAAAz3B,OAAAlb,OAAA2yC,GAAAz3B,EAAA/b,MAAAH,KAAAL,WAe/Bg0C,OAf+B1yC,EAAA0yC,EAAA,CAAA,CAAAzyC,IAAA,eAAAC,MAiBhC,SAAcgC,GACoC,kBAArCA,EAAKwR,OAAOtV,OAAOggC,gBAC5Bl8B,EAAK9D,OAAOm2B,SAAWryB,EAAKwR,OAAOtV,OAAOggC,iBAE7C,CAAAn+B,IAAA,cAAAC,MAED,WAAe,IAAAilB,EAAApmB,KACb+qB,EAAAA,EAAA4oB,EAAAptC,+BAAAE,KAAAzG,MACIA,KAAKX,OAAOm2B,UAIZx1B,KAAKX,OAAO2K,SACT4lB,KAAAA,aAAaoP,iBAAmBh/B,KAAKX,OAAO2K,QAGnDhK,KAAK6zC,YACAt4B,KAAAA,GAAG9B,IAA8B,SAACq6B,GACrC1tB,EAAK2tB,QAAQD,MAEf9zC,KAAKg0C,SAAWh0C,KAAKg0C,SAAS/nC,KAAKjM,MACnCA,KAAKi0C,oBAAsBj0C,KAAKwtB,KAAK,uBAAwBxtB,KAAKg0C,SAAU,CAC1ErmB,IAAK,SAAChnB,GACJA,EAAEutC,iBACFvtC,EAAE+I,qBAGN1P,KAAKiM,KAAK,CAAC,QAAS,YAAajM,KAAKi0C,wBACvC,CAAA/yC,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACFwgB,EAAcn0C,KAAKy1B,KAAK,kBAClBxiB,EAAAA,YAAY0gB,EAAM0L,eAClBpsB,EAAAA,YAAY0gB,EAAM0P,qBAC/B,CAAAniC,IAAA,WAAAC,MAED,SAAUwF,GACRA,EAAEutC,iBACFvtC,EAAE+I,kBACMokC,IAAAA,EAAoB9zC,KAAK2U,OAAzBm/B,gBACHtjB,KAAAA,eAAe7pB,EAAG,uBAAwB,CAAEy8B,cAAe0Q,IAC3DA,EAGH9zC,KAAK2U,OAAO0uB,oBAFZrjC,KAAK2U,OAAOy/B,qBAIf,CAAAlzC,IAAA,UAAAC,MAED,SAASkhC,GACFriC,KAAKgT,OAGKqvB,EAAAriC,KAAKg1B,QAAQ,aAAc,QAAUh1B,KAAKg1B,QAAQ,aAAc,UAC/Eh1B,KAAKq0C,WAAWhS,MACjB,CAAAnhC,IAAA,aAAAC,MAED,SAAYkhC,GACV,IAAQrS,EAAahwB,KAAbgwB,SACFskB,EAASt0C,KAAKy1B,KAAK,YACzB6e,GAAUt0C,KAAKu0C,kBAAkBD,EAAQjS,EAAerS,EAAStQ,uBAAyBsQ,EAASvQ,sBACpG,CAAAve,IAAA,gBAAAC,MAED,WACS,MAAA,CACLk+B,cAAe,CAAEjM,KAAMohB,GAAiB3gB,MAAO,kBAC/CwP,kBAAmB,CAAEjQ,KAAMqhB,GAAqB5gB,MAAO,sBAE1D,CAAA3yB,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAA4oB,EAAAptC,2BAAAE,KAAAzG,MACAA,KAAKshC,OAAO,CAAC,QAAS,YAAathC,KAAKg0C,YACzC,CAAA9yC,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,gGAAAp1B,OAGE+xB,GAAWnyB,KAAM,qBAAsBA,KAAK4vB,aAAagQ,YAAW,uBAEvE,CAAA,CAAA1+B,IAAA,aAAAK,IApGD,WACS,MAAA,kBAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPo0B,SAAS,EACTxrB,OAAQ,UAEX2pC,GAfwCe,8yBCdtBC,IAAAA,YAAWpU,GAAAtkB,EAAA04B,EAAApU,GAAArkB,IAAAA,EAAAC,EAAAw4B,GAAA,SAAAA,IAAAz4B,OAAAlb,OAAA2zC,GAAAz4B,EAAA/b,MAAAH,KAAAL,WAU7Bg1C,OAV6B1zC,EAAA0zC,EAAA,CAAA,CAAAzzC,IAAA,cAAAC,MAY9B,WAAe,IAAAilB,EAAApmB,KACbA,KAAK6zC,YACAe,KAAAA,QAAU,SAACjuC,GACdA,EAAEutC,iBACFvtC,EAAE+I,kBACGrQ,EAAAA,OAAOu1C,QAAQjuC,IAGtB3G,KAAKiM,KAAK,CAAC,QAAS,YAAajM,KAAK40C,WACvC,CAAA1zC,IAAA,gBAAAC,MAED,WACS,MAAA,CACL0zC,WAAY,CAAEzhB,KAAM0hB,GAASjhB,MAAO,yBAEvC,CAAA3yB,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACR3zB,KAAKiT,YAAYjT,KAAKgT,KAAM2gB,EAAMkhB,cACnC,CAAA3zC,IAAA,OAAAC,MAED,WACOiF,EAAAA,SAASpG,KAAKgT,KAAM,UAC1B,CAAA9R,IAAA,OAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,UAC7B,CAAA9R,IAAA,SAAAC,MAED,WACE,MAAA,qDAED,CAAA,CAAAD,IAAA,aAAAK,IA5CD,WACS,MAAA,gBACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUG,SACpBxxB,MAAO,OAEVuzC,GAVsC3gB,4wBCoBpB+gB,YAAUnB,GAAA33B,EAAA84B,EAAAnB,GAAA13B,IAAAA,EAAAC,EAAA44B,GAAA,SAAAA,IAAA3uB,IAAAA,EAAAplB,OAAA+zC,GAAA,IAAA,IAAAr1C,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAwF5BqmB,OAXD6B,EAAAuY,EA7E6BtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAgFN,wBAAA,SAACwD,GAClByf,EAAKzR,OAAOsuB,YAAc7c,EAAK/mB,OAAO21C,mBACb,KAAvBr2C,OAAOivC,cAAkD,KAA5BjvC,OAAOivC,YACjCj5B,EAAAA,OAAO84B,aAAa,GAEpB94B,EAAAA,OAAO84B,aAAa,QAG9BrnB,EAnEA2uB,OAmEA9zC,EAAA8zC,EAAA,CAAA,CAAA7zC,IAAA,cAAAC,MAjED,WAAe,IAAAumB,EAAA1nB,KACb+qB,EAAAA,EAAAgqB,EAAAxuC,+BAAAE,KAAAzG,MACA,IAAQX,EAAyBW,KAAzBX,OAAQuwB,EAAiB5vB,KAAjB4vB,aAChB,IAAIvwB,EAAOm2B,QAAX,CAIIn2B,EAAO2K,SACJ4lB,KAAAA,aAAaoP,iBAAmBh/B,KAAKX,OAAO2K,QAG7Cu4B,IAAAA,EAASzsB,EAAKhI,kBAEhB8hB,EAAaoP,mBAAqBuD,GACpCviC,KAAK2U,OAAOsgC,gBAAgB/mB,OAAM,SAAAvnB,OAGpC3G,KAAK6zC,YAEL7zC,KAAKk1C,iBAAmBl1C,KAAKwtB,KAAK,mBAAoBxtB,KAAKm1C,iBAAkB,CAC3ExnB,IAAK,SAAChnB,GACIs8B,IAAAA,EAAevb,EAAK/S,OAApBsuB,WACHzS,EAAAA,eAAe7pB,EAAG,oBAAqB,CAC1C+7B,KAAM,aACNC,KAAMM,EACNL,IAAKK,OAKXjjC,KAAKiM,KAAK,uBAAwB,CAAC,WAAY,SAAUjM,KAAKk1C,kBAEzD35B,KAAAA,GAAG9B,IAA0B,SAAC4oB,GAC3B+S,IAAAA,EAAU1tB,EAAK+N,KAAK,YACf/N,GAAAA,EAAK6sB,kBAAkBa,EAAS/S,EAAe3a,EAAKsI,SAASxQ,oBAAsBkI,EAAKsI,SAASzQ,iBAC5GmI,EAAKqsB,QAAQ1R,MAEXriC,KAAKX,OAAOg2C,eACTC,KAAAA,YAAct1C,KAAK2U,OAAO8b,eAAe,CAC5C9B,OAAQgmB,GACRxyC,QAAS,CACP9C,OAAQ,CACNu1C,QAAS,SAACjuC,GACR+gB,EAAKwtB,iBAAiBvuC,SAMT,WAAnBwgB,GAAQhG,QACH+G,OAAAA,iBAAiB,oBAAqBloB,KAAKu1C,yBAErD,CAAAr0C,IAAA,gBAAAC,MAeD,WACS,MAAA,CACL8hC,WAAY,CAAE7P,KAAMoiB,GAAe3hB,MAAO,qBAC1CsY,eAAgB,CAAE/Y,KAAMqiB,GAAmB5hB,MAAO,yBAErD,CAAA3yB,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAgqB,EAAAxuC,2BAAAE,KAAAzG,MACKshC,KAAAA,OAAO,iBAAqC,WAAnBna,GAAQhG,OAAsB,WAAa,QAASnhB,KAAKk1C,kBAChE,WAAnB/tB,GAAQhG,QACHiH,OAAAA,oBAAoB,oBAAqBpoB,KAAKu1C,wBAExD,CAAAr0C,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,iBAAkB0gB,EAAMsP,YACpChwB,KAAAA,YAAY,iBAAkB0gB,EAAMwY,kBAG3C,CAAAjrC,IAAA,mBAAAC,MAIA,SAAkBwF,GACZA,aAAa+L,QACf/L,EAAEutC,iBACFvtC,EAAE+I,mBAEJ,IAAQiF,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,QACqC,IAA5BA,EAAOkuC,kBAAiE,mBAA5BluC,EAAOkuC,kBAAmCluC,EAAOkuC,oBAEhH54B,EAAOsuB,WACTtuB,EAAO0uB,oBAEP1uB,EAAOy/B,mBAEJL,KAAAA,QAAQp/B,EAAOsuB,aACX5jC,EAAO21C,kBACZrgC,EAAOsuB,WACTtuB,EAAOw4B,uBAEPx4B,EAAO+gC,sBAEJ3B,KAAAA,QAAQp/B,EAAOsuB,aACX5jC,EAAOs2C,gBAAmD,mBAA1Bt2C,EAAOs2C,eACzCA,EAAAA,eAAehhC,EAAOsuB,YAEzBtuB,EAAOsuB,YACTtuB,EAAOw3B,iBAEH9sC,EAAOu2C,sBACT51C,KAAK61C,iBAGPlhC,EAAOsgC,gBAAgB/mB,OAAM,SAAAvnB,OAEzBtH,EAAOu2C,sBAAwBjhC,EAAOmhC,YAAc,GACjDC,KAAAA,WAAW12C,EAAO22C,wBAM/B,CAAA90C,IAAA,UAAAC,MAIA,SAASkhC,GACQA,EAAAriC,KAAKg1B,QAAQ,aAAc,QAAUh1B,KAAKg1B,QAAQ,aAAc,UAC3Eh1B,KAAKs1C,cACHjT,GACFriC,KAAKs1C,YAAY/mC,OACjBvO,KAAKqO,SAELrO,KAAKs1C,YAAYjnC,OACjBrO,KAAKuO,WAKX,CAAArN,IAAA,SAAAC,MAGA,WACM,IAAAnB,KAAKX,OAAOm2B,QAAZ,CAIJ,MAAA,2FAAAp1B,OAGE+xB,GAAWnyB,KAJG,kBAIYA,KAAK4vB,aAAagQ,YAAW,uBAI3D,CAAA1+B,IAAA,aAAAC,MAKA,SAAYysC,GACN,IACFC,OAAOD,YAAYqI,KAAKrI,GAAa1f,OAAM,SAAAvnB,aACpCA,OAIX,CAAAzF,IAAA,eAAAC,MAGA,WACM,IACF0sC,OAAOD,YAAYsI,SAAShoB,OAAM,SAAAvnB,aAC3BA,QAEV,CAAA,CAAAzF,IAAA,aAAAK,IA9MD,WACS,MAAA,eAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPmsC,kBAAkB,EAClByH,kBAAkB,EAClBY,sBAAsB,EACtBI,oBAAqB,YACrBL,eAAgB,KAChB3rC,OAAQ,KACRwrB,SAAS,EACT6f,cAAc,OAEjBN,GArBqCL,uoBChBlCyB,YAAIvC,GAAA33B,EAAAk6B,EAAAvC,GAAA13B,IAAAA,EAAAC,EAAAg6B,GAAA,SAAAA,IAAA/vB,IAAAA,EAAAplB,OAAAm1C,GAAA,IAAA,IAAAz2C,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAuDPqmB,OAvDO6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAwCG,YAAA,SAACwD,GACVA,EAAEutC,iBACFvtC,EAAE+I,kBACF,IAAQiF,EAAR6rB,EAAApa,GAAQzR,OAWD,OAVF6b,EAAAA,eAAe7pB,EAAG,oBAAqB,CAAE+7B,KAAM,SAAUC,KAAMhuB,EAAO0Q,OAAQud,IAAKjuB,EAAO0Q,SAC3F1Q,EAAOU,MACTV,EAAOyhC,SACEzhC,EAAO0Q,QAChB1Q,EAAO+U,OACPtD,EAAK2tB,SAAQ,KAEbp/B,EAAO4U,QACPnD,EAAK2tB,SAAQ,KAER,KACR3tB,EA5CA+vB,OA4CAl1C,EAAAk1C,EAAA,CAAA,CAAAj1C,IAAA,cAAAC,MA1CD,WACE4pB,EAAAA,EAAAorB,EAAA5vC,+BAAAE,KAAAzG,MACmBA,KAAXX,OACGm2B,UAGXx1B,KAAK6zC,YACL7zC,KAAKiM,KAAK,CAAC,WAAY,SAAUjM,KAAKg0C,UAEtCh0C,KAAKq2C,eACLr2C,KAAK+zC,SAAQ,MACd,CAAA7yC,IAAA,eAAAC,MAED,WAAgB,IAAAumB,EAAA1nB,KACN2U,EAAW3U,KAAX2U,OACR3U,KAAKub,GAAG,CAAC9B,EAAaA,EAAcA,EAAcA,IAAiB,WAC5Ds6B,EAAAA,QAAQp/B,EAAO0Q,aAEvB,CAAAnkB,IAAA,gBAAAC,MAED,WACS,MAAA,CACLuoB,KAAM,CAAE0J,KAAMkjB,GAASziB,MAAO,gBAC9BtK,MAAO,CAAE6J,KAAMmjB,GAAU1iB,MAAO,oBAEnC,CAAA3yB,IAAA,YAAAC,MAmBD,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,iBAAkB0gB,EAAMjK,MACpCzW,KAAAA,YAAY,iBAAkB0gB,EAAMpK,SAC1C,CAAAroB,IAAA,UAAAC,MAED,SAASkkB,GACH,GAACrlB,KAAK2U,OAAN,CACJ,IAAQqb,EAAahwB,KAAbgwB,SACFskB,EAASt0C,KAAKy1B,KAAK,YACrBpQ,GACG2P,KAAAA,QAAQ,aAAc,SAC3Bsf,GAAUt0C,KAAKu0C,kBAAkBD,EAAQtkB,EAAS/Q,aAE7C+V,KAAAA,QAAQ,aAAc,QAC3Bsf,GAAUt0C,KAAKu0C,kBAAkBD,EAAQtkB,EAAS9Q,gBAErD,CAAAhe,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAorB,EAAA5vC,2BAAAE,KAAAzG,MACAA,KAAKshC,OAAO,CAAC,WAAY,SAAUthC,KAAKg0C,YACzC,CAAA9yC,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,qFAAAp1B,OAGE+xB,GAAWnyB,KAAM,YAAaA,KAAK4vB,aAAagQ,YAAW,uBAE9D,CAAA,CAAA1+B,IAAA,aAAAK,IAzFD,WACS,MAAA,SACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUI,cACpBzxB,MAAO,EACPo0B,SAAS,OAEZ2gB,GAXgBzB,ICLb8B,GAAM,CACV,CAAEjjB,IAAK,WAAY/tB,UAAW,0BAA2BixC,SAAU,eACnE,CAAEljB,IAAK,YAAa/tB,UAAW,2BAA4BixC,SAAU,gBAGlDC,GAAS,WAC5B,SAAAA,EAAavzC,GAAMnC,OAAA01C,GACZC,KAAAA,UAAYxzC,EAAKwzC,WAAa,GACL,IAA1B32C,KAAK22C,UAAU/2C,QACjBI,KAAK22C,UAAUhvC,KAAK,CAAEivC,QAAS,IAEjC52C,KAAK62C,UAAY1zC,EAAK2zC,eACtB92C,KAAK+2C,WAAa,CAChBC,eAAgB7zC,EAAK6zC,gBAAkB,oBACvCC,gBAAiB9zC,EAAK8zC,cACtBC,UAAW/zC,EAAK+zC,WAAa,IAE1BlqC,KAAAA,MAAQ7J,EAAK6J,OAAS,CACzBgzB,YAAa,GACbC,YAAa,GACbF,cAAe,IAEjB//B,KAAK6S,SAAW,EAChB7S,KAAKm3C,YAAc,EACnBn3C,KAAKo3C,YAAc,EACnBp3C,KAAKq3C,YAAa,EAsOnBX,OArOAz1C,EAAAy1C,EAAA,CAAA,CAAAx1C,IAAA,iBAAAC,MAED,SAAgB0R,GAAU,IAAAuT,EAAApmB,KACxBA,KAAK6S,SAAWA,EAChB,IAAIxR,EAAQ,EACJs1C,EAAc32C,KAAd22C,UACR32C,KAAK22C,UAAYA,EAAU/uC,KAAI,SAAA/B,GAKtBA,OAJFxE,EAAAA,MAAQwM,SAASxM,EAAO,IAC7BwE,EAAKvE,IAAMuM,SAASxM,EAAQwE,EAAK+wC,QAAUxwB,EAAKvT,SAAU,IAC1DhN,EAAKgN,SAAWhF,SAAShI,EAAK+wC,QAAUxwB,EAAKvT,SAAU,IAC9ChN,GAAAA,EAAK+wC,QAAUxwB,EAAKvT,SACtBhN,OAEV,CAAA3E,IAAA,iBAAAC,MAED,WAAgBW,IAAAA,EAAInC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,SAAUirB,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAE23C,SAAU,EAAGC,SAAU,EAAGC,YAAa,GACvEC,EAA4Bz3C,KAA5By3C,aAAcd,EAAc32C,KAAd22C,UAClBc,KAAAA,EAAa73C,OAAS,GAAtB63C,CAGJ,IAAQH,EAAoC1sB,EAApC0sB,SAAUC,EAA0B3sB,EAA1B2sB,SAAUC,EAAgB5sB,EAAhB4sB,YACxBF,IAAaC,GACF3vC,EAAAA,KAAI,SAAC/B,EAAMzE,GAClBA,EAAQk2C,EACLx1C,EAAAA,GAAMkL,MAAMN,MAAQ,OAChBtL,EAAQk2C,IACZx1C,EAAAA,GAAMkL,MAAMN,MAAQ,MAI/B,IAAMgrC,EAAWf,EAAUW,GACrBK,EAAsB,IAAhBH,EAAoB,GAAKA,EAAcE,EAASr2C,OAASq2C,EAAS7kC,SACjEykC,EAAAA,GAAUx1C,GAAMkL,MAAMN,MAAQirC,EAAM,EAAI,EAAC,GAAAv3C,OAAY,IAANu3C,EAAY,QACzE,CAAAz2C,IAAA,cAAAC,MAED,SAAaypB,GACX,GAAK5qB,KAAK+2C,WAAWE,iBAAiBj3C,KAAK22C,UAAU/2C,OAAS,GAG9D,GAAKgrB,EAAL,CAcA,IAAMgtB,EAAY53C,KAAK63C,UAA6B,IAAnBjtB,EAAK1W,YAAoBlU,KAAKq3C,YAC/D,GAAIO,GAAa,GAAKA,IAAc53C,KAAKq3C,WAAY,CACnDr3C,KAAKq3C,YAAa,GAAMr3C,KAAK83C,aAAa93C,KAAKq3C,YAC/Cr3C,KAAK+3C,cAAcH,GACnB,IAAMI,EAAQ,CACZ52C,MAAOw2C,EACPK,SAAUj4C,KAAKq3C,WACfa,SAAUl4C,KAAK22C,UAAU32C,KAAKq3C,aAEhCr3C,KAAKq3C,WAAaO,EACbf,KAAAA,WAAa72C,KAAK62C,UAAUmB,SAtB7B,GAAAh4C,KAAKq3C,YAAiB,EAAA,CACnBS,KAAAA,aAAa93C,KAAKq3C,YACvB,IAAMW,EAAQ,CACZ52C,OAAO,EACP62C,SAAUj4C,KAAKq3C,WACfa,SAAU,MAEPrB,KAAAA,WAAa72C,KAAK62C,UAAUmB,GACjCh4C,KAAKq3C,YAAa,KAgBvB,CAAAn2C,IAAA,SAAAC,MAED,WAAQypB,IAAAA,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEw4C,OAAQ,EAAGjuB,OAAQ,GAAKrX,EAAQlT,UAAAC,OAAAD,EAAAA,kBAAA0D,EAC3C,IAACrD,KAAK6S,UAAYhF,SAAoB,IAAXgF,EAAiB,MAAQ7S,KAAK6S,SAAU,CACjE,IAACA,GAAyB,IAAbA,EACf,OAEF7S,KAAKo4C,eAAevqC,SAAoB,IAAXgF,EAAiB,KAEhD,IAAQukC,EAA6Bp3C,KAA7Bo3C,YAAaD,EAAgBn3C,KAAhBm3C,YACrB,GAAiC,cAA7BrhC,EAAKpO,OAAOkjB,EAAKV,QAAyB,CAC5C,IAAM0tB,EAAY53C,KAAK63C,UAAwB,IAAdjtB,EAAKV,OAAektB,GACrD,GAAIQ,EAAY,EACd,OAEF53C,KAAKq4C,eAAe,SAAU,CAC5Bf,SAAUM,EACVL,SAAUH,EACVI,YAAa3pC,SAAuB,IAAd+c,EAAKV,OAAe,MAE5ClqB,KAAKo3C,YAAcQ,EAGrB,GAAiC,cAA7B9hC,EAAKpO,OAAOkjB,EAAKutB,QAAyB,CAC5C,IAAMG,EAAYt4C,KAAK63C,UAAwB,IAAdjtB,EAAKutB,OAAehB,GACrD,GAAImB,EAAY,EACd,OAEFt4C,KAAKq4C,eAAe,SAAU,CAC5Bf,SAAUgB,EACVf,SAAUJ,EACVK,YAAa3pC,SAAuB,IAAd+c,EAAKutB,OAAe,MAE5Cn4C,KAAKm3C,YAAcmB,KAEtB,CAAAp3C,IAAA,YAAAC,MAED,SAAW+B,EAAMq0C,GACf,IAAQZ,EAAc32C,KAAd22C,UACR,IAAKA,GAAkC,IAArBA,EAAU/2C,OACnB,OAAA,EAEL+2C,GAAqB,IAArBA,EAAU/2C,OACL,OAAA,EAET,GAAI23C,GAAW,GAAMA,EAAWZ,EAAU/2C,QAAUsD,EAAOyzC,EAAUY,GAAUl2C,OAAS6B,EAAOyzC,EAAUY,GAAUj2C,IAC1Gi2C,OAAAA,EAET,GAAIr0C,EAAOyzC,EAAUA,EAAU/2C,OAAS,GAAGyB,MACzC,OAAOs1C,EAAU/2C,OAAS,EAG5B,IAAA,IAAS+B,EAAI,EAAGA,EAAIg1C,EAAU/2C,OAAQ+B,IACpC,GAAIuB,EAAOyzC,EAAUh1C,GAAGN,OAAS6B,GAAQyzC,EAAUh1C,GAAGL,IAAK,CAC9CK,EAAAA,EACX,MAGG41C,OAAAA,IACR,CAAAr2C,IAAA,iBAAAC,MAED,WAEE,IADMgF,IAAAA,EAAWnG,KAAKgT,KAAK7M,SAClBxE,EAAI,EAAGA,EAAIwE,EAASvG,OAAQ+B,IACnC,GAAImU,EAAKxP,SAASH,EAASxE,GAAI3B,KAAK+2C,WAAWC,gBACtC,MAAA,CACL3xC,IAAKc,EAASxE,GACdwR,IAAKhN,EAASxE,GAAG4lC,2BAMzB,CAAArmC,IAAA,eAAAC,MACA,SAAcC,GACN+E,IAAAA,EAAWnG,KAAKgT,KAAK7M,SAC3B,OAAI/E,EAAQ,GAAKA,GAAS+E,EAASvG,OAC1B,KAEF,CACLyF,IAAKc,EAAS/E,GACd+R,IAAKhN,EAAS/E,GAAOmmC,2BAExB,CAAArmC,IAAA,eAAAC,MAED,WAEE,IADMgF,IAAAA,EAAWnG,KAAKgT,KAAK7M,SAClBxE,EAAI,EAAGA,EAAIwE,EAASvG,OAAQ+B,IACnCmU,EAAK3O,YAAYhB,EAASxE,GAAI3B,KAAK+2C,WAAWC,kBAEjD,CAAA91C,IAAA,gBAAAC,MAED,SAAeC,GACP+E,IAAAA,EAAWnG,KAAKgT,KAAK7M,SACvB/E,GAAAA,EAAQ+E,EAASvG,OAEZ,OADPkW,EAAK1P,SAASD,EAAS/E,GAAQpB,KAAK+2C,WAAWC,gBACxC,CACL3xC,IAAKc,EAAS/E,GACd+R,IAAKhN,EAAS/E,GAAOmmC,2BAG1B,CAAArmC,IAAA,UAAAC,MAED,WACEnB,KAAKy3C,aAAe,KACpBz3C,KAAK22C,UAAY,KACjB32C,KAAKgT,KAAKvN,UAAY,KAGxB,CAAAvE,IAAA,QAAAC,MAIA,SAAOo3C,GAAY,IAAA7wB,EAAA1nB,KAOjB,GALA0F,OAAOC,KAAK3F,KAAK+2C,YAAYnxC,SAAQ,SAAA1E,QACXmC,IAApBk1C,EAAWr3C,KACR61C,EAAAA,WAAW71C,GAAOq3C,EAAWr3C,OAGlCq3C,EAAW5B,UAAW,CAMxB,GALA32C,KAAK22C,UAA4C,IAAhC4B,EAAW5B,UAAU/2C,OAAe,CAAC,CAAEg3C,QAAS,IAAO2B,EAAW5B,UAC9EyB,KAAAA,eAAep4C,KAAK6S,UACzB7S,KAAKo3C,YAAc,EACnBp3C,KAAKm3C,YAAc,EAEfn3C,KAAKgT,KAEAuV,IADDA,IAAAA,EAAKvoB,KAAKgT,KAAK7M,SACdoiB,EAAG3oB,OAAS,GACZoT,KAAAA,KAAK6V,YAAYN,EAAG,IAI7BvoB,KAAK60B,YAER,CAAA3zB,IAAA,SAAAC,MAED,WAAU,IAAAwmB,EAAA3nB,KACA+/B,EAAkB//B,KAAKgN,MAAvB+yB,cAIR,GAHK//B,KAAKgT,OACRhT,KAAKgT,KAAO8C,EAAK9Q,UAAU,YAAa,GAAI,GAAI,kBAE9ChF,KAAK22C,UAAW,CAClB,IAAA6B,EAAsCx4C,KAAK+2C,WAAnCG,EAASsB,EAATtB,UAAWF,EAAcwB,EAAdxB,eACnBh3C,KAAKy3C,aAAez3C,KAAK22C,UAAU/uC,KAAI,SAAC/B,GACtC,IAAM4yC,EAAQ3iC,EAAK9Q,UAAU,WAAY,GAAI,CAC3CgI,MAAO+yB,EAAa,cAAA3/B,OAAiB2/B,EAAa3/B,YAAAA,OAAWyF,EAAK+wC,SAAO,SAAAx2C,OAAcyF,EAAK+wC,UAC7Fx2C,GAAAA,OAAKyF,EAAK6yC,QAAU1B,EAAiB,GAAE52C,6BAAAA,OAA4B82C,IAU7D,OARFlkC,EAAAA,KAAKC,YAAYwlC,GAElB7yC,GAAAA,SAAQ,SAAAC,GACV4yC,EAAMxlC,YAAY6C,EAAK9Q,UAAUa,EAAK0tB,IAAK,GAAI,CAC7CvmB,MAAOnH,EAAK4wC,wBAAQr2C,OAAkBunB,EAAK3a,MAAMnH,EAAK4wC,UAAwB,cAAA,YAC7E5wC,EAAKL,eAGH,CACL2yC,OAAQM,EAAMtyC,SAAS,GACvB+jB,OAAQuuB,EAAMtyC,SAAS,OAI7B,OAAOnG,KAAKgT,SACb0jC,EA1P2B,GCqBxBiC,GAAuB,CAC3BC,MAAO,oBACPC,UAAW,yBAEPC,YAAQvY,GAAAtkB,EAAA68B,EAAAvY,GAAArkB,IAAAA,EAAAC,EAAA28B,GAkCZ,SAAAA,EAAa31C,GAAMijB,IAAAA,EA+BhBA,OA/BgBplB,OAAA83C,GAEjB7wB,EAAAuY,EADAtkB,EAAAA,EAAAzV,UAAMtD,kBA0TK,SAACwD,EAAGikB,GACf6V,IAAAA,EAAAD,EAAApa,GAAQjT,EAAGstB,EAAHttB,IAAK9T,EAAMohC,EAANphC,OAAQsV,EAAM8rB,EAAN9rB,OACjBzF,EAAM0b,EACV,GAAIjkB,EAAG,CACLmP,EAAKtM,MAAM7C,GACX,IAAMoyC,EAAQjjC,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACnCC,EAAyB,KAArB6D,EAAO0vB,UAAmB0U,EAAMlvC,QAAUkvC,EAAMnvC,QACtDuJ,GAAAA,EAAI6lC,QAAU70C,KAAK0P,IAAIV,EAAIrC,EAAIA,GAAKzR,EAAO45C,aAC7C,OAEF9lC,EAAI6lC,QAAS,EACb7lC,EAAIrC,EAAIA,EACFsV,EAAAA,EAAK8yB,YAAYvyC,EAAGmK,GAEvBqoC,EAAAA,iBAAiB,WAAYjqC,EAAKvI,GACvCyf,EAAKgzB,kBAAkBlqC,MAGzB+Y,EAAAuY,EAAApa,GAKc,eAAA,SAACzf,GACRyf,EAAKjT,IAAIkmC,WAGdjzB,EAAKjT,IAAIkmC,UAAW,EACpB1yC,EAAEutC,iBACFvtC,EAAE+I,sBACHuY,EAAAuY,EAAApa,wBAEmB,SAAC5c,EAAOohB,GACrBoZ,EAAAA,OAAO9gC,KAAO0nB,EAAK1W,YACxBkS,EAAKkzB,YAAY1uB,EAAK1W,YAAa0W,EAAK2uB,SAAU3uB,EAAKgsB,QAAS,GAChExwB,EAAKgzB,kBAAkBxuB,MACxB3C,EAAAuY,EAAApa,sBAEiB,SAACzf,EAAGikB,GACpB4V,EAAApa,GAAQjT,IACJ6lC,QAAU5yB,EAAKkzB,YAAY1uB,EAAK1W,YAAa0W,EAAK2uB,SAAU3uB,EAAKgsB,QAAS,MAC/E3uB,EAAAuY,EAAApa,wBAEmB,SAACzf,EAAGikB,GACtB,IAAA4uB,EAAAhZ,EAAApa,GAAQ4d,EAAMwV,EAANxV,OAAQ7wB,EAAGqmC,EAAHrmC,IAAK9T,EAAMm6C,EAANn6C,OAAQsV,EAAM6kC,EAAN7kC,OACzBqvB,EAAO9gC,KAAO0nB,EAAK1W,YACrB0W,EAAK6uB,SAAU,EAEf7uB,EAAK6uB,SAAU,EAEjBzV,EAAO9gC,KAAO0nB,EAAK1W,YACff,EAAIumC,SAAWvmC,EAAI6lC,SACrB7lC,EAAI6lC,QAAS,EACNW,EAAAA,eAAiBhlC,EAAO4U,QAC1B4vB,EAAAA,iBAAiB,YAAavuB,EAAMjkB,GACpC6pB,EAAAA,eAAe,OAAQ,YAAa5F,IAE3CxE,EAAKkzB,YAAY1uB,EAAK1W,YAAa0W,EAAK2uB,SAAU3uB,EAAKgsB,QAAS,GAC3DuC,EAAAA,iBAAiB,WAAYvuB,EAAMjkB,GACxCyf,EAAKgzB,kBAAkBxuB,MACxB3C,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GACb,IAAAizC,EAAApZ,EAAApa,GAAQ4d,EAAM4V,EAAN5V,OAAQrvB,EAAMilC,EAANjlC,OAAQxB,EAAGymC,EAAHzmC,IAAK9T,EAAMu6C,EAANv6C,OAAQuwB,EAAYgqB,EAAZhqB,aAC/BmpB,EAAQjjC,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACnCC,EAAyB,KAArB6D,EAAO0vB,UAAmB0U,EAAMlvC,QAAUkvC,EAAMnvC,QACtD+K,KAAAA,EAAOssB,QAAU5hC,EAAOw6C,gBAAmBjqB,EAAa6N,qBAAuB9oB,EAAOU,OAAtFV,CAIJ,GAAKA,EAAO9B,UAAa8B,EAAOmlC,UAAhC,CAIAnzC,EAAE+I,kBAEF0W,EAAKsa,QACL5qB,EAAK3H,gBAAgByhB,EAAa4O,sBAAwB5O,EAAa4O,sBACvE1oB,EAAK3H,gBAAgB9O,EAAO06C,cAAgB16C,EAAO06C,cACnDjkC,EAAKtM,MAAM7C,GACXwM,EAAIrC,EAAIA,EACRqC,EAAIumC,QAAS,EACbvmC,EAAI6lC,QAAS,EACbhV,EAAOgW,YAAcrlC,EAAOT,YAG5BS,EAAO+rB,MAAM,CAAEC,UAAU,IACzBva,EAAK6zB,kBAAmB,EACnB7zC,EAAAA,SAASggB,EAAK8zB,YAAa,UAEhC,IAAMhrC,EAAMkX,EAAK8yB,YAAYvyC,EAAGmK,GAczB,OAbP5B,EAAI8qC,YAAchW,EAAOgW,YACpBG,EAAAA,sBAAsBxzC,EAAGuI,GAGZ,eADAvI,EAAE7E,MAElBskB,EAAKpT,KAAKkV,iBAAiB,YAAa9B,EAAKg0B,aAC7Ch0B,EAAKpT,KAAKkV,iBAAiB,WAAY9B,EAAKi0B,WAC5Cj0B,EAAKpT,KAAKkV,iBAAiB,cAAe9B,EAAKi0B,aAE1C/Y,EAAAA,OAAO,YAAalb,EAAKk0B,YAC9Bl0B,EAAKm0B,2BAGA,EAjCL5lC,EAAO+U,WAkCVzB,EAAAuY,EAAApa,GAEW,aAAA,SAACzf,GACX,IAAA6zC,EAAAha,EAAApa,GAAQzR,EAAM6lC,EAAN7lC,OAAQtV,EAAMm7C,EAANn7C,OAAQ8T,EAAGqnC,EAAHrnC,IAAKyc,EAAY4qB,EAAZ5qB,aAAcoU,EAAMwW,EAANxW,OAC3C,GAAK7wB,EAAL,CAGAxM,EAAE+I,kBACF/I,EAAEutC,iBACFp+B,EAAK3H,gBAAgByhB,EAAa6O,qBAAuB7O,EAAa6O,qBACtE3oB,EAAK3H,gBAAgB9O,EAAOo7C,YAAcp7C,EAAOo7C,YACjD3kC,EAAKtM,MAAM7C,GACNQ,EAAAA,YAAYif,EAAK8zB,YAAa,UAEnC,IAAMhrC,EAAMkX,EAAK8yB,YAAYvyC,EAAGwM,EAAIrC,GACpC5B,EAAI8qC,YAAchW,EAAOgW,YACrB7mC,EAAI6lC,QACDG,EAAAA,iBAAiB,UAAWjqC,EAAKvI,GACjC6pB,EAAAA,eAAe,OAAQ,UAAWthB,KAElCiqC,EAAAA,iBAAiB,QAASjqC,EAAKvI,GAC/B6pB,EAAAA,eAAe,QAAS,QAASthB,IAEnCwrC,EAAAA,oBAAoB/zC,EAAGuI,GAE5BiE,EAAI6lC,QAAS,EACb7lC,EAAIumC,QAAS,EACbvmC,EAAIrC,EAAI,EACRqC,EAAIpC,EAAI,EACRoC,EAAIkmC,UAAW,EACfrV,EAAOgW,YAAc,EACrBhW,EAAO9gC,KAAO,EACd,IAAMyyB,EAAYhvB,EAAE7E,KACF,aAAd6zB,GAA0C,gBAAdA,GAC9BvP,EAAKpT,KAAKoV,oBAAoB,YAAahC,EAAKg0B,aAChDh0B,EAAKpT,KAAKoV,oBAAoB,WAAYhC,EAAKi0B,WAC/Cj0B,EAAKpT,KAAKoV,oBAAoB,cAAehC,EAAKi0B,WAElDj0B,EAAKgb,SAELhb,EAAKu0B,4BACAxnC,EAAIynC,QAG+B,WAAtChrB,EAAa2N,sBAAqCnX,EAAKna,KAAK,YAAama,EAAKk0B,YAF9El0B,EAAK+a,aAAax6B,IAMtBmP,EAAKrS,WAAU+8B,EAAApa,IAAO,WACpBA,EAAKy0B,mBACJ,GAEHlmC,EAAO+rB,YACRzY,EAAAuY,EAAApa,GA4Ba,eAAA,SAACzf,GACb,IAAAm0C,EAAAta,EAAApa,GAAQ4d,EAAM8W,EAAN9W,OAAQ7wB,EAAG2nC,EAAH3nC,IAAKwB,EAAMmmC,EAANnmC,OAAQtV,EAAMy7C,EAANz7C,OACzByW,EAAK7F,qBAEPtJ,EAAEutC,iBAEJp+B,EAAKtM,MAAM7C,GACX,IAAMoyC,EAAQjjC,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACnCC,EAAyB,KAArB6D,EAAO0vB,UAAmB0U,EAAMlvC,QAAUkvC,EAAMnvC,QACpD4G,EAAOrM,KAAK0P,IAAIV,EAAIrC,EAAIA,GACzBqC,KAAAA,EAAI6lC,QAAUxoC,EAAOnR,EAAO45C,eAAmB9lC,EAAI6lC,QAAUxoC,EAAOnR,EAAO07C,eAA3E5nC,CAGLA,EAAIrC,EAAIA,EACR,IAAM5B,EAAMkX,EAAK8yB,YAAYvyC,EAAGmK,GAChC5B,EAAI8qC,YAAchW,EAAOgW,YACpBgB,EAAAA,sBAAsBr0C,EAAGuI,OAC/B+Y,EAAAuY,EAAApa,GAEY,cAAA,SAACzf,GACPwyC,EAAAA,iBAAiB,WAAY,KAAMxyC,MACzCshB,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GACRwyC,EAAAA,iBAAiB,YAAa,KAAMxyC,MAC1CshB,EAAAuY,EAAApa,GAEc,gBAAA,SAACzf,GACds0C,IAAAA,EAAAza,EAAApa,GAAQzR,EAAMsmC,EAANtmC,OAAQxB,EAAG8nC,EAAH9nC,IACZA,KAAAA,EAAIumC,QAAUvmC,EAAIynC,SAAWjmC,EAAOssB,SAAYtsB,EAAOtV,OAAOo+B,qBAAuB9oB,EAAOU,OAA5FlC,CAGJA,EAAIynC,SAAU,EACT3uC,EAAAA,KAAK,YAAama,EAAKk0B,YACvBruC,EAAAA,KAAK,aAAcma,EAAK+a,cAE7BrrB,EAAKtM,MAAM7C,GACX,IAAMoyC,EAAQjjC,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACnCC,EAAyB,KAArB6D,EAAO0vB,UAAmB0U,EAAMlvC,QAAUkvC,EAAMnvC,QACpDsF,EAAMkX,EAAK8yB,YAAYvyC,EAAGmK,GAC3BqoC,EAAAA,iBAAiB,aAAcjqC,EAAKvI,GACzCyf,EAAKsa,YACNzY,EAAAuY,EAAApa,GAEc,gBAAA,SAACzf,GACTwyC,EAAAA,iBAAiB,aAAc,KAAMxyC,GAC1Cyf,EAAK8vB,SACL9vB,EAAKgzB,kBAAkB,SACxBnxB,EAAAuY,EAAApa,oBAEe,WACd80B,IAAAA,EAA+B90B,EAAKjT,IAA5BrC,EAACoqC,EAADpqC,EAAG4oC,EAAMwB,EAANxB,OACPkB,GADsBM,EAAPN,UACHlB,EAAQ,CACtB,IAAMxqC,EAAMkX,EAAK8yB,YAAY,KAAMpoC,GAC9BwpC,EAAAA,WAAW,KAAMprC,OAtiBxBkX,EAAK+0B,SAAU,EAIf/0B,EAAK6zB,kBAAmB,EAKxB7zB,EAAKg1B,gBAAkB,GAIvBh1B,EAAK4d,OAAS,CACZjgC,KAAK,EACLs3C,MAAO,EACPn4C,KAAM,EACN82C,aAAa,GAGf5zB,EAAKk1B,cAAe,EAGqB,kBAA9Bl1B,EAAK/mB,OAAOk8C,gBACrBt7C,QAAQf,KAAK,iFACRG,EAAAA,OAAOm8C,eAAiBp1B,EAAK/mB,OAAOk8C,eAC1Cn1B,EAjCF0yB,OAkCA73C,EAAA63C,EAAA,CAAA,CAAA53C,IAAA,iBAAAK,IAED,WACE,OAAOvB,KAAK4vB,aAAa6P,gBAAkBz/B,KAAK2U,OAAO8mC,gBAAkBz7C,KAAK2U,OAAO9B,WACtF,CAAA3R,IAAA,WAAAK,IAED,WACE,OAAOvB,KAAK4vB,aAAa6P,gBAAkBz/B,KAAK2U,OAAO9B,WACxD,CAAA3R,IAAA,aAAAK,IAED,WACS,OAAAvB,KAAK4vB,aAAa8P,YAAc,IACxC,CAAAx+B,IAAA,cAAAK,IAED,WACE,IAAA2uB,EAA2ClwB,KAAK2U,OAAxC+mC,EAAiBxrB,EAAjBwrB,kBAAmBxnC,EAAWgc,EAAXhc,YAC3B,OAAOwnC,GAAqB,EAAIA,EAAqBxnC,EAAclU,KAAK0/B,aACzE,CAAAx+B,IAAA,cAAAC,MAED,WAAag6C,IAAAA,IAAOx7C,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GAClBK,KAAKm7C,QAAUA,IAGjB,CAAAj6C,IAAA,OAAAC,MAIA,SAAMA,GACJnB,KAAKgT,OAAShT,KAAKgT,KAAKhG,MAAMsB,QAAU,UAE1C,CAAApN,IAAA,aAAAC,MAKA,WAAyC,IAAAumB,EAAA1nB,KAA7B22C,EAASh3C,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIN,EAAMM,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC9Bg3C,GAAkC,IAArBA,EAAU/2C,SAC1B+2C,EAAY,CAAC,CAAEC,QAAS,KAEpBruB,IAAAA,EAAEgI,EAAAA,EAAA,CACNomB,UAAAA,GACGt3C,GAAM,GAAA,CACTy3C,eAAgB,SAAClsB,GACV4F,EAAAA,eAAe,iBAAkB,iBAAkB5F,MAGvD5qB,KAAK27C,UAOHA,KAAAA,UAAUC,MAAMrzB,IANhBozB,KAAAA,UAAY,IAAIjF,GAAUnuB,GAC1BszB,KAAAA,MAAMllB,aAAa32B,KAAK27C,UAAU9mB,SAAU70B,KAAK67C,MAAM11C,SAAS,IACrE,CAAC,iBAAkB,eAAgB,gBAAiB,gBAAgByB,KAAI,SAAA/B,GACtE6hB,EAAK7hB,GAAQ6hB,EAAKi0B,UAAU91C,GAAMoG,KAAKyb,EAAKi0B,iBAKjD,CAAAz6C,IAAA,oBAAAC,MAED,SAAmBypB,GACjB5qB,KAAK27C,WAAa37C,KAAK27C,UAAUG,YAAYlxB,KAC9C,CAAA1pB,IAAA,cAAAC,MAED,WACE,IAAInB,KAAKX,OAAOm2B,UAAWx1B,KAAK4vB,aAAawN,OAA7C,CAGAp9B,KAAKmT,IAAM,CACTrC,EAAG,EACHC,EAAG,EACHioC,QAAQ,EACRU,QAAQ,EACRkB,SAAS,EACTvB,UAAU,GAEPwC,KAAAA,MAAQ77C,KAAKy1B,KAAK,YACvBmL,IAAAA,EAAqD5gC,KAAKX,OAAlD23C,EAAcpW,EAAdoW,eAAgBC,EAAarW,EAAbqW,cAAeC,EAAStW,EAATsW,UAClC6E,KAAAA,WAAW/7C,KAAKX,OAAOs3C,UAAW,CAAEK,eAAAA,EAAgBC,cAAAA,EAAeC,UAAAA,EAAWlqC,MAAOhN,KAAK4vB,aAAakQ,aAAe,KACpG,WAAnB3Y,GAAQhG,SACVnhB,KAAKX,OAAOm8C,gBAAiB,EAC7Bx7C,KAAKg8C,UAAW,GAGb9B,KAAAA,YAAcl6C,KAAKy1B,KAAK,0BAE7Bz1B,KAAKq2C,eACLr2C,KAAKi8C,gBACLj8C,KAAKk8C,qBAGP,CAAAh7C,IAAA,eAAAC,MAIA,WAAgB,IAAAwmB,EAAA3nB,KACTub,KAAAA,GAAG9B,GAAwB,WAC9BkO,EAAKwZ,kBAGF5lB,KAAAA,GAAG9B,GAAoB,WAC1BkO,EAAKw0B,kBAGF5gC,KAAAA,GAAG9B,GAAe,WACrBkO,EAAKw0B,eACLx0B,EAAKy0B,mBAGF7gC,KAAAA,GAAG9B,GAAiB,WACvBkO,EAAKy0B,mBAGF7gC,KAAAA,GAAG9B,GAAc,WACpBkO,EAAKy0B,eAAc,GACnBz0B,EAAKw0B,cAAa,GAClBx0B,EAAKqc,OAAOjgC,IAAM,KAGfwX,KAAAA,GAAG9B,GAAgB,WACtBkO,EAAK00B,aAGF9gC,KAAAA,GAAG9B,IAAqB,WAC3BkO,EAAK20B,qBAIT,CAAAp7C,IAAA,YAAAC,MAIA,SAAW9B,GAAQ,IAAAuoB,EAAA5nB,KACbu8C,EAAQ,KACZ72C,OAAOC,KAAKtG,GAAQuG,SAAQ,SAAA1E,GACrB7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,GACd,cAARA,IACFq7C,EAAQl9C,EAAO6B,OAGfq7C,GACGR,KAAAA,WAAWQ,EAAOl9C,KAE1B,CAAA6B,IAAA,kBAAAC,MAED,WACE,IACQ++B,GADgBlgC,KAAK4vB,cAAgB,IAArCkQ,YACAI,eACAga,EAAgBl6C,KAAhBk6C,YACJha,IAC4B,iBAAnBA,EACTga,EAAYltC,MAAMwvC,UAAYtc,EACK,WAA1Bn+B,EAAOm+B,IAChBx6B,OAAOC,KAAKu6B,GAAgBt4B,KAAI,SAAA1G,GAClB8L,EAAAA,MAAM9L,GAAOg/B,EAAeh/B,SAMhD,CAAAA,IAAA,mBAAAC,MAKA,SAAkBW,EAAM8oB,EAAMphB,GACxBxJ,KAAKo7C,gBAAgBx7C,OAAS,GAC3Bw7C,KAAAA,gBAAgBxzC,KAAI,SAAA/B,GACvB,GAAIA,GAAQA,EAAKwnB,SAAWxnB,EAAK/D,OAASA,EACpC,IACGurB,EAAAA,QAAQzC,EAAMphB,SACZvK,GACPgB,QAAQhB,MAAKmB,gCAAAA,OAAiCyF,EAAI,UAAU5G,SAOtE,CAAAiC,IAAA,cAAAC,MAKA,SAAaW,EAAMglC,GACbA,GAA4B,mBAAXA,GACnB9mC,KAAKo7C,gBAAgBzzC,KAAK,CAAE7F,KAAAA,EAAYurB,QAASyZ,MAIrD,CAAA5lC,IAAA,iBAAAC,MAKA,SAAgBW,EAAM0H,GACpB,IAAQ4xC,EAAoBp7C,KAApBo7C,gBACJpnC,GAAS,EACGpM,EAAAA,KAAI,SAAC/B,EAAMzE,GACrByE,GAAQA,EAAK/D,OAASA,GAAQ+D,EAAKwnB,UAAY7jB,IACxCpI,EAAAA,MAGT4S,GAAa,GACC3H,EAAAA,OAAO2H,EAAQ,KAInC,CAAA9S,IAAA,SAAAC,MAIA,WACE,IAAQwT,EAAgB3U,KAAhB2U,OAAQxB,EAAQnT,KAARmT,IAChBA,EAAIynC,SAAU,EACdznC,EAAIkmC,UAAW,EACX1kC,EAAOssB,SAGNK,KAAAA,OAAO,YAAathC,KAAKs6C,YAC1BnnC,EAAIumC,OACDpY,KAAAA,OAAO,aAActhC,KAAKmhC,cAGjCnhC,KAAKohC,UACN,CAAAlgC,IAAA,gBAAAC,MAED,WACU9B,IAAAA,EAAWW,KAAK2U,OAAhBtV,OACRW,KAAKm6C,sBAAwBn6C,KAAKwtB,KAAK,YAAaxtB,KAAKy8C,mBACzDz8C,KAAK06C,oBAAsB16C,KAAKwtB,KAAK,UAAWxtB,KAAK08C,iBACrD18C,KAAKg7C,sBAAwBh7C,KAAKwtB,KAAK,OAAQxtB,KAAK28C,mBAE1B,UAAtB38C,KAAKiwB,cAAkD,eAAtBjwB,KAAKiwB,cACxCjwB,KAAKgT,KAAKkV,iBAAiB,aAAcloB,KAAK48C,aAGtB,UAAtB58C,KAAKiwB,cAAkD,eAAtBjwB,KAAKiwB,eACnChkB,KAAAA,KAAK,YAAajM,KAAK48C,aACI,WAAhCv9C,EAAOk+B,sBAAqCv9B,KAAKiM,KAAK,aAAcjM,KAAKkhC,cACpEj1B,KAAAA,KAAK,YAAajM,KAAK68C,aACvB5wC,KAAAA,KAAK,WAAYjM,KAAK88C,YAE3B98C,KAAK2U,OAAO3B,KAAKkV,iBAAiB,QAASloB,KAAK+8C,aAAa,MAEhE,CAAA77C,IAAA,mBAAAC,MAED,WAAoB67C,IAAAA,EACXA,OAAS,QAATA,EAAIh9C,KAACgT,YAAI,IAAAgqC,OAAA,EAATA,EAAWC,gBAAiB33C,WACpC,CAAApE,IAAA,yBAAAC,MAED,WACQ+7C,IAAAA,EAAel9C,KAAKm9C,mBAC1Bn9C,KAAKo9C,cAAgBF,EACrBA,EAAah1B,iBAAiB,YAAaloB,KAAKo6C,aAAa,GAC7D8C,EAAah1B,iBAAiB,UAAWloB,KAAKq6C,WAAW,KAC1D,CAAAn5C,IAAA,4BAAAC,MAED,WACE,IAAM+7C,EAAel9C,KAAKo9C,eAAiBp9C,KAAKm9C,mBAChDD,EAAa90B,oBAAoB,YAAapoB,KAAKo6C,aAAa,GAChE8C,EAAa90B,oBAAoB,UAAWpoB,KAAKq6C,WAAW,GAC5Dr6C,KAAKo9C,cAAgB,OACtB,CAAAl8C,IAAA,QAAAC,MAED,WACOwT,KAAAA,OAAO6R,SAAS62B,gBAChBj3C,EAAAA,SAASpG,KAAKgT,KAAM,YAC1B,CAAA9R,IAAA,OAAAC,MAED,WACMnB,KAAKs7C,eAGJ3mC,KAAAA,OAAO6R,SAAS82B,kBAChBn2C,EAAAA,YAAYnH,KAAKgT,KAAM,aAC7B,CAAA9R,IAAA,cAAAC,MAED,WACEnB,KAAKs7C,cAAe,IACrB,CAAAp6C,IAAA,aAAAC,MAED,WACEnB,KAAKs7C,cAAe,IACrB,CAAAp6C,IAAA,iBAAAC,MAkKD,WACE,IAAQgS,EAA8BnT,KAA9BmT,IAAKyc,EAAyB5vB,KAAzB4vB,aAAcvwB,EAAWW,KAAXX,OACtB8T,IAGLnT,KAAKgT,KAAKoV,oBAAoB,YAAapoB,KAAKo6C,aAChDp6C,KAAKgT,KAAKoV,oBAAoB,WAAYpoB,KAAKq6C,WAC/Cr6C,KAAKgT,KAAKoV,oBAAoB,cAAepoB,KAAKq6C,WAClDr6C,KAAK26C,6BACAxnC,EAAIumC,QAAW15C,KAAKi6C,oBAGzBnkC,EAAK3H,gBAAgByhB,EAAa6O,qBAAuB7O,EAAa6O,qBACtE3oB,EAAK3H,gBAAgB9O,EAAOo7C,YAAcp7C,EAAOo7C,YAC5CtzC,EAAAA,YAAYnH,KAAKk6C,YAAa,UACnC/mC,EAAI6lC,QAAS,EACb7lC,EAAIumC,QAAS,EACbvmC,EAAIrC,EAAI,EACRqC,EAAIpC,EAAI,EACRoC,EAAIkmC,UAAW,EACfr5C,KAAKgkC,OAAOgW,YAAc,EAC1Bh6C,KAAKgkC,OAAO9gC,KAAO,EACnBlD,KAAK66C,iBACL76C,KAAKohC,WACN,CAAAlgC,IAAA,cAAAC,MAmED,SAAa+S,EAAaqlC,EAAU3C,EAAS90C,GAC3C,IAAQzC,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACZtV,IAAAA,EAAOk+C,kBAA6B,IAATz7C,EAA3BzC,CAIJ,IAAMm+C,EAAWjE,EAAWA,GAAY5kC,EAAO9B,SAAW8B,EAAO9B,SAAWxT,EAAOo+C,UAAYnnB,OAAOijB,GAAUmE,QAAQ,GAExH19C,KAAK29C,cAAc/G,GACnB52C,KAAK49C,WAAW1pC,IACH,IAATpS,GAAgBzC,EAAOm8C,gBAA8C,UAA5B7mC,EAAOtV,OAAO0nB,aAG3D/mB,KAAKgkC,OAAOjgC,IAAMy5C,EAClBx9C,KAAKgkC,OAAOqX,MAAQmC,EAAW7oC,EAAOT,YAAc,EAAI,EACxDS,EAAOkpC,KAAKL,OACb,CAAAt8C,IAAA,cAAAC,MAED,SAAawF,EAAGmK,GACd,IAEI6+B,EAAQmO,EAFJnpC,EAAW3U,KAAX2U,OACR2yB,EAAqCtnC,KAAKgT,KAAKu0B,wBAAvC76B,EAAK46B,EAAL56B,MAAOC,EAAM26B,EAAN36B,OAAQ62B,EAAG8D,EAAH9D,IAAK3C,EAAIyG,EAAJzG,KAEtBj3B,EAAUkH,EACS,KAArB6D,EAAO0vB,WACA13B,EAAAA,EACD62B,EAAAA,IAEC92B,EAAAA,EACDm0B,EAAAA,GAEV,IAAIxsB,EAASzK,EAAUk0C,EAEnBlH,GADJviC,EAASA,EAASs7B,EAASA,EAAUt7B,EAAS,EAAI,EAAIA,GAC/Bs7B,EACvBiH,EAAUA,EAAU,EAAI,EAAKA,EAAU,EAAI,EAAIA,EAC5CtgB,OAAOptB,MAAM0tC,KACJA,EAAA52C,KAAK2U,OAAOT,YAAclU,KAAKy7C,gBAE3C,IAAMvnC,EAAcrG,SAAS+oC,EAAU52C,KAAKy7C,eAAiB,IAAM,IAAM,IAElE,MAAA,CACL7E,QAAAA,EACA1iC,YAAAA,EACAqlC,SAJezjC,EAAKxB,uBAAuBJ,EAAaS,EAAO4vB,cAK/DlwB,OAAAA,EACA3H,MAAOijC,EACP9O,KAAMid,EACNn3C,EAAAA,KAIJ,CAAAzF,IAAA,aAAAC,MAKA,SAAY+B,GACV,IAAQyR,EAAqB3U,KAArB2U,OAAQ9B,EAAa7S,KAAb6S,SACZ3P,EAAO2P,EACFA,EAAAA,EACE3P,EAAO,IACTA,EAAA,GAEH66C,IAAAA,EAAWppC,EAAO+Z,QAAQxrB,KAC5B66C,GACFA,EAASH,WAAW16C,KAIxB,CAAAhC,IAAA,iBAAAC,MAGA,WACEnB,KAAKi6C,kBAAmB,EAClB8D,IAAAA,EAAW/9C,KAAK2U,OAAO+Z,QAAQxrB,KACrC66C,GAAYA,EAASC,gBAGvB,CAAA98C,IAAA,gBAAAC,MAKA,SAAey1C,EAASqH,GAElB,GADJj+C,KAAKi6C,kBAAmB,GACpBj6C,KAAKX,OAAOm2B,QAAZ,CAGJohB,EAAUA,EAAU,EAAI,EAAKA,EAAU,EAAI,EAAIA,EAC/C52C,KAAKk6C,YAAYltC,MAAM6zB,KAAIzgC,GAAAA,OAAgB,IAAVw2C,EAAgB,KACjD52C,KAAK27C,UAAU9I,OAAO,CAAE3oB,OAAQ0sB,EAAU52C,KAAKy7C,gBAAkBz7C,KAAKy7C,gBAC9Dld,IAAAA,EAAiBv+B,KAAK2U,OAAO+Z,QAA7B6P,aACRA,GAAgBA,EAAasU,OAAO,CAAE3oB,OAAQ0sB,EAAU52C,KAAKy7C,gBAAkBz7C,KAAKy7C,mBAGtF,CAAAv6C,IAAA,eAAAC,MAKA,SAAc2R,GACZ,IAAQ6B,EAAmC3U,KAAnC2U,OAAQqvB,EAA2BhkC,KAA3BgkC,OAAQyX,EAAmBz7C,KAAnBy7C,eACnB9mC,KAAAA,EAAOwvB,WAAaxvB,EAAO9C,MAAMwY,SAAYrqB,KAAKi6C,mBAAqBtlC,EAAO8xB,SAA9E9xB,CAGDqvB,GAAAA,EAAOjgC,KAAU,EAAA,CACb8P,IAAAA,EAAMhG,SAAsB,IAAbm2B,EAAOjgC,IAAY,IAAM8J,SAA8B,IAArB8G,EAAOT,YAAoB,IAC7E8vB,GAAiB,IAAjBA,EAAOqX,OAAexnC,EAAM,KAA0B,IAAjBmwB,EAAOqX,OAAexnC,GAAa,IAE3E,YADAmwB,EAAOjgC,KAAM,GAGbigC,EAAOjgC,KAAM,EAGjB,IAAIb,EAAOlD,KAAKkU,YAChBhR,EAAO4S,EAAKlD,qBAAqB1P,EAAMu4C,EAAgB3oC,GACvD9S,KAAK27C,UAAU9I,OAAO,CAAE3oB,OAAQhnB,GAAQu4C,GACnCvB,KAAAA,YAAYltC,MAAM6zB,KAAI,GAAAzgC,OAAM8C,EAAOu4C,EAAiB,IAAM,QAGjE,CAAAv6C,IAAA,gBAAAC,MAKA,SAAe2R,GACb,IAAQ6B,EAAqB3U,KAArB2U,OAAQ9B,EAAa7S,KAAb6S,SAChB,GAAK8B,EAAL,CAIIupC,IAAAA,EAAOvpC,EAAOwpC,cAAc78C,IAChC48C,EAAOpoC,EAAKlD,qBAAqBsrC,EAAMrrC,EAAUC,GACjD9S,KAAK27C,UAAU9I,OAAO,CAAEsF,OAAQ+F,GAAQrrC,MACzC,CAAA3R,IAAA,UAAAC,MAED,WACEnB,KAAK27C,UAAU9I,OAAO,CAAE3oB,OAAQ,EAAGiuB,OAAQ,GAAK,GAC3C+B,KAAAA,YAAYltC,MAAM6zB,KAAO,OAC/B,CAAA3/B,IAAA,UAAAC,MAED,WACE,IAAQwT,EAAW3U,KAAX2U,OACR3U,KAAKo+C,gBAAkB,KACvBp+C,KAAK27C,UAAU/qB,UACf5wB,KAAK27C,UAAY,KACjB,IAAQ1rB,EAAiBjwB,KAAjBiwB,aACa,UAAjBA,GAA6C,eAAjBA,IAC9BjwB,KAAKgT,KAAKoV,oBAAoB,aAAcpoB,KAAK48C,aACjD58C,KAAKgT,KAAKoV,oBAAoB,YAAapoB,KAAKo6C,aAChDp6C,KAAKgT,KAAKoV,oBAAoB,WAAYpoB,KAAKq6C,WAC/Cr6C,KAAKgT,KAAKoV,oBAAoB,cAAepoB,KAAKq6C,YAE/B,UAAjBpqB,GAA6C,eAAjBA,IACzBqR,KAAAA,OAAO,YAAathC,KAAK48C,aACzBtb,KAAAA,OAAO,aAActhC,KAAKkhC,cAC1BI,KAAAA,OAAO,YAAathC,KAAKs6C,YACzBhZ,KAAAA,OAAO,aAActhC,KAAKmhC,cAC/BnhC,KAAK26C,4BACLhmC,EAAO3B,KAAKoV,oBAAoB,QAASpoB,KAAK+8C,aAAa,MAE9D,CAAA77C,IAAA,SAAAC,MAED,WACE,IAAInB,KAAKX,OAAOm2B,UAAWx1B,KAAK4vB,aAAawN,OAA7C,CAGMihB,IAAAA,EAAer+C,KAAK2U,OAAO6R,SAAWxmB,KAAK2U,OAAO6R,SAASnnB,OAAOo3B,KAAO,GAE/Er2B,MAAAA,+CAAAA,OADmC,WAAjBi+C,EAA4B,2BAA6B,GAE1B,oLAMlD,CAAA,CAAAn9C,IAAA,aAAAK,IAtwBD,WACS,MAAA,aAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUO,gBACpB5xB,MAAO,EACPo0B,SAAS,EACTgmB,gBAAgB,EAChB3B,eAAe,EACfF,eAAe,EACf4D,kBAAkB,EAClB5G,UAAW,CAAC,CAAEC,QAAS,IACvBI,eAAgB2B,GAAqBC,MACrC1B,UAAW,GACXD,eAAe,EACfgC,aAAc,EACd8B,cAAe,EACfhB,YAAa,aAEbU,UAAW,aACXgD,UAAW,MAEd,CAAAv8C,IAAA,uBAAAK,IAED,WACSo3C,OAAAA,OACRG,GAhCoB9kB,IC7BjBsqB,YAAI/d,GAAAtkB,EAAAqiC,EAAA/d,GAAArkB,IAAAA,EAAAC,EAAAmiC,GAaR,SAAAA,EAAan7C,GAAMijB,IAAAA,EAEMA,OAFNplB,OAAAs9C,IACjBpiC,EAAAA,EAAAzV,UAAMtD,IACDo7C,YAAa,EAAKn4B,EAJxBk4B,OAKAr9C,EAAAq9C,EAAA,CAAA,CAAAp9C,IAAA,WAAAK,IAED,WACE,IAAA2uB,EAAqClwB,KAAK2U,OAAlC8mC,EAAcvrB,EAAdurB,eAAgB5oC,EAAQqd,EAARrd,SACjB,OAAA7S,KAAK4vB,aAAa6P,gBAAkBgc,GAAkB5oC,IAC9D,CAAA3R,IAAA,cAAAK,IAED,WACE,IAAAi9C,EAA2Cx+C,KAAK2U,OAAxC+mC,EAAiB8C,EAAjB9C,kBAAmBxnC,EAAWsqC,EAAXtqC,YACpBwnC,OAAAA,GAAqB,EAAIA,EAAoBxnC,IACrD,CAAAhT,IAAA,aAAAK,IAED,WACS,OAAAvB,KAAK4vB,aAAa8P,YAAc,IACxC,CAAAx+B,IAAA,cAAAC,MAED,WACE,IAAMs9C,EAAgBz+C,KAAK2U,OAAO6R,SAASnnB,OAAOo3B,KAC7CA,KAAAA,KAAyB,SAAlBgoB,EAA2B,OAAS,SAC5Cz+C,KAAKX,OAAOm2B,UAGE,SAAdx1B,KAAKy2B,OACPz2B,KAAK0+C,mBACA1rC,KAAAA,KAAKhG,MAAMsB,QAAU,QAEvBqwC,KAAAA,YAAc3+C,KAAKy1B,KAAK,kBACxBmpB,KAAAA,QAAU5+C,KAAKy1B,KAAK,iBAEzBz1B,KAAKq2C,kBAGP,CAAAn1C,IAAA,eAAAC,MAIA,WAAgB,IAAAumB,EAAA1nB,KACdA,KAAKub,GAAG,CAAC9B,EAAwBA,EAAeA,IAAqB,SAAC9S,GAChD,mBAAhBA,EAAEkF,YACJ6b,EAAK62B,YAAa,GAEpB72B,EAAKm3B,kBAGFtjC,KAAAA,GAAG9B,GAAc,WAEpBiO,EAAKm3B,cAAa,MAGftjC,KAAAA,GAAG9B,GAAgB,WACtBiO,EAAK20B,eAIT,CAAAn7C,IAAA,OAAAC,MAIA,SAAMA,GACA,GAAc,SAAdnB,KAAKy2B,KAGP,OAFAz2B,KAAK8+C,eAAiB9+C,KAAK8+C,aAAa9xC,MAAMsB,QAAU,cACxDtO,KAAK++C,eAAiB/+C,KAAK++C,aAAa/xC,MAAMsB,QAAU,UAGrD0E,KAAAA,KAAKhG,MAAMsB,QAAU,UAC3B,CAAApN,IAAA,OAAAC,MAED,WACM,GAAc,SAAdnB,KAAKy2B,KAGP,OAFAz2B,KAAK8+C,eAAiB9+C,KAAK8+C,aAAa9xC,MAAMsB,QAAU,aACxDtO,KAAK++C,eAAiB/+C,KAAK++C,aAAa/xC,MAAMsB,QAAU,SAGrD0E,KAAAA,KAAKhG,MAAMsB,QAAU,SAC3B,CAAApN,IAAA,eAAAC,MAED,SAAc2R,GACZ,IAAQ6B,EAA6B3U,KAA7B2U,OAAQtV,EAAqBW,KAArBX,OAAQwT,EAAa7S,KAAb6S,SACxB,IAAIxT,EAAOm2B,UAAWx1B,KAAKu+C,YAAe5pC,EAAO8xB,SAAjD,CAGIuY,IAAAA,EAAUh/C,KAAKkU,YAAclU,KAAK0/B,WACtCsf,EAAUlpC,EAAKlD,qBAAqBosC,EAASnsC,EAAUC,GACrC,SAAd9S,KAAKy2B,MACPz2B,KAAK8+C,aAAar5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO+1C,IACxDnsC,IAAaoX,EAAAA,GAAYpX,EAAW,IACtC7S,KAAK++C,aAAat5C,UAAYqQ,EAAK7M,OAAO4J,MAG5C7S,KAAK4+C,QAAQn5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO+1C,IACnDnsC,IAAaoX,EAAAA,GAAYpX,EAAW,IACtC7S,KAAK2+C,YAAYl5C,UAAYqQ,EAAK7M,OAAO4J,QAG9C,CAAA3R,IAAA,UAAAC,MAED,WACoB,SAAdnB,KAAKy2B,MACPz2B,KAAK8+C,aAAar5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO,IAC5DjJ,KAAK++C,aAAat5C,UAAYqQ,EAAK7M,OAAO,KAE1CjJ,KAAK4+C,QAAQn5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO,IACvDjJ,KAAK2+C,YAAYl5C,UAAYqQ,EAAK7M,OAAO,MAE5C,CAAA/H,IAAA,mBAAAC,MAED,WACE,IAAQwT,EAAW3U,KAAX2U,OACR,GAAKA,EAAO6R,UAAa7R,EAAO6R,SAASsa,OAAzC,CAGMA,IAAAA,EAASnsB,EAAO6R,SAASsa,OAC/B9gC,KAAK8+C,aAAehpC,EAAK9Q,UACvB,UACA,QACA,GACA,8BAEFhF,KAAK++C,aAAejpC,EAAK9Q,UACvB,UACA,QACA,GACA,+BAEF87B,EAAO36B,SAASvG,OAAS,EACrBkhC,EAAOnK,aAAa32B,KAAK8+C,aAAche,EAAO36B,SAAS,IACvD26B,EAAO7tB,YAAYjT,KAAK8+C,cACrB7rC,EAAAA,YAAYjT,KAAK++C,cACxB/+C,KAAKs0B,SAAW,CAACt0B,KAAK8+C,aAAc9+C,KAAK++C,iBAC1C,CAAA79C,IAAA,kBAAAC,MAED,WACE,IAAQ9B,EAAWW,KAAXX,OACJW,KAAK6S,WAAaoX,EAAAA,GAAYjqB,KAAK4vB,aAAawN,QAC7C/uB,EAAAA,KAAKrO,KAAK2+C,aACVtwC,EAAAA,KAAKrO,KAAK4+C,SACf9oC,EAAKzH,KAAKrO,KAAKy1B,KAAK,oBACpB3f,EAAKvH,KAAKvO,KAAKy1B,KAAK,oBAEpB3f,EAAKzH,KAAKrO,KAAKy1B,KAAK,mBAElBp2B,EAAOgP,KACTrO,KAAKqO,OAGPrO,KAAKuO,SACN,CAAArN,IAAA,kBAAAC,MAED,SAAiBi8B,GACXA,GACG/uB,EAAAA,KAAKrO,KAAK2+C,aACVtwC,EAAAA,KAAKrO,KAAK4+C,SACf9oC,EAAKzH,KAAKrO,KAAKy1B,KAAK,oBACpB3f,EAAKvH,KAAKvO,KAAKy1B,KAAK,qBAEpB3f,EAAKzH,KAAKrO,KAAKy1B,KAAK,mBACpB3f,EAAKvH,KAAKvO,KAAKy1B,KAAK,oBACflnB,EAAAA,KAAKvO,KAAK2+C,aACVpwC,EAAAA,KAAKvO,KAAK4+C,YAElB,CAAA19C,IAAA,aAAAC,MAED,SAAY+B,GACVlD,KAAKu+C,YAAa,GACZr7C,GAAiB,IAATA,GAAeA,EAAOlD,KAAK6S,WAGvB,SAAd7S,KAAKy2B,KAITz2B,KAAK4+C,QAAQn5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO/F,IAHrDlD,KAAK8+C,aAAar5C,UAAYzF,KAAKi/C,aAAanpC,EAAK7M,OAAO/F,OAI/D,CAAAhC,IAAA,eAAAC,MAED,SAAc+9C,GACZ,OAAOA,EACJj4C,MAAM,KACNW,KAAI,SAAAzG,GAAKf,MAAAA,gCAAAA,OAAoCe,EAAK,cAClD0G,KAAK,OACT,CAAA3G,IAAA,cAAAC,MAED,WAAe,IAAAwmB,EAAA3nB,KACL2U,EAAW3U,KAAX2U,OACFwqC,EAAc,WAClBx3B,EAAK42B,YAAa,GAEf9iC,KAAAA,IAAIhC,EAAe0lC,GACpBxqC,EAAOwvB,WAAaxvB,EAAO9C,MAAMwY,QAC9B1Q,KAAAA,KAAKF,EAAe0lC,GAEzBn/C,KAAKu+C,YAAa,IAErB,CAAAr9C,IAAA,UAAAC,MAED,WACU2/B,IAAAA,EAAW9gC,KAAK2U,OAAO6R,SAAvBsa,OACR9gC,KAAK8+C,cAAgBhe,EAAOjY,YAAY7oB,KAAK8+C,cAC7C9+C,KAAK8+C,aAAe,KACpB9+C,KAAK++C,cAAgBje,EAAOjY,YAAY7oB,KAAK++C,cAC7C/+C,KAAK++C,aAAe,OACrB,CAAA79C,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,0MAAAp1B,OAI8BJ,KAAKoV,KAAKmL,SAAQ,8BAEjD,CAAA,CAAArf,IAAA,aAAAK,IAnOD,WACS,MAAA,SACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUI,cACpBzxB,MAAO,EACPo0B,SAAS,OAEZ8oB,GAXgBtqB,urECcborB,YAAM7e,GAAAtkB,EAAAmjC,EAAA7e,GAAArkB,IAAAA,EAAAC,EAAAijC,GAAA,SAAAA,IAAAh5B,IAAAA,EAAAplB,OAAAo+C,GAAA,IAAA,IAAA1/C,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAuQTqmB,OAvQS6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KA8EO,kBAAA,SAACwD,GAChB,IAAQgO,EAAR6rB,EAAApa,GAAQzR,OACF0qC,EAAMj5B,EAAKqP,KAAK,iBACtB3f,EAAKtM,MAAM7C,GAEL24C,IAAAA,EAAUD,EAAI9X,wBACdp0B,EAAM2C,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACjClE,EAAS2yC,EAAQ3yC,QAAUwG,EAAItJ,QAAUy1C,EAAQ9b,KAKvD,GAJArwB,EAAItG,EAAIF,EACRwG,EAAIosC,KAAOD,EAAQ3yC,OACnByZ,EAAKjT,IAAMA,IAEPxG,GAAa,GAMV,OAHF6yC,EAAAA,gBAAgB7yC,EAAQhG,GACpBuhB,SAAAA,iBAAiB,UAAW9B,EAAKq5B,cAC1Cr5B,EAAKs5B,GAAGC,SAAU,GACX,KACR13B,EAAAuY,EAAApa,GAEgB,kBAAA,SAACzf,GAChB,IAAQ+4C,EAARlf,EAAApa,GAAQs5B,GACJ,GAACA,EAAGC,QAAJ,CAGJnG,IAAAA,EAAAhZ,EAAApa,GAAQjT,EAAGqmC,EAAHrmC,IAAKwB,EAAM6kC,EAAN7kC,OACbhO,EAAEutC,iBACFvtC,EAAE+I,kBACFoG,EAAKtM,MAAM7C,GACX,IAAMoyC,EAAQjjC,EAAKlF,YAAYjK,EAAGgO,EAAO9D,MACzC6uC,EAAGE,UAAW,EACd,IAAMhzC,EAAIuG,EAAItG,EAAIksC,EAAMlvC,QAAUsJ,EAAItJ,QAClC+C,EAAIuG,EAAIosC,MAGPC,EAAAA,gBAAgB5yC,EAAGjG,OACzBshB,EAAAuY,EAAApa,GAEc,gBAAA,SAACzf,GACdmP,EAAKtM,MAAM7C,GACFyhB,SAAAA,oBAAoB,UAAWhC,EAAKq5B,cAC7C,IAAQC,EAARlf,EAAApa,GAAQs5B,GACRA,EAAGC,SAAU,EACbD,EAAGE,UAAW,KACf33B,EAAAuY,EAAApa,GAwFc,gBAAA,SAACzf,GACdyf,EAAKs5B,GAAGhjC,UAAW,EACnB0J,EAAKsa,QACLta,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,gBAEpB7F,EAAAuY,EAAApa,GAEc,gBAAA,SAACzf,GACdyf,EAAKs5B,GAAGhjC,UAAW,EACdmjC,EAAAA,QAAQ,KAAK,EAAOl5C,GACzByf,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,gBAEpB7F,EAAAuY,EAAApa,GA0BgB,kBAAA,SAACzf,GACZ,GAACyf,EAAKzR,OAAN,CAGJ,IAAAub,EAA0B9J,EAAKzR,OAAvB6Q,EAAK0K,EAAL1K,MAAOC,EAAMyK,EAANzK,OACVW,EAAKs5B,GAAGE,WACXx5B,EAAKqP,KAAK,kBAAkBzoB,MAAML,OAAS6Y,GAAoB,IAAXC,EAAe,MAAK,GAAArlB,OAAe,IAATqlB,EAAe,KACzFW,EAAK/mB,OAAOygD,gBACd15B,EAAK25B,qBAGJhM,EAAAA,QAAQvuB,EAAOC,OACrBW,EAtPAg5B,OAsPAn+C,EAAAm+C,EAAA,CAAA,CAAAl+C,IAAA,gBAAAC,MApPD,WACS,MAAA,CACL6+C,YAAa,CAAE5sB,KAAM6sB,GAAgBpsB,MAAO,mBAC5CqsB,YAAa,CAAE9sB,KAAM+sB,GAAgBtsB,MAAO,aAC5CusB,YAAa,CAAEhtB,KAAMitB,GAAgBxsB,MAAO,qBAE/C,CAAA3yB,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KAOT,GANJA,KAAKsgD,SAAW,KAChBtgD,KAAK0/C,GAAK,CACRC,SAAS,EACTC,UAAU,EACVljC,UAAU,IAER1c,KAAKX,OAAOm2B,QAAZ,CAIJx1B,KAAK6zC,YAEL,IAAA0M,EAAgCvgD,KAAK4vB,aAA7BkQ,EAAWygB,EAAXzgB,YAAara,EAAM86B,EAAN96B,OACjBqa,EAAYK,cACdngC,KAAKy1B,KAAK,kBAAkBzoB,MAAMwzC,gBAAkB1gB,EAAYK,aAElEngC,KAAKygD,mBAAqBzgD,KAAKwtB,KAAK,eAAe,SAAC7mB,GAClD+gB,EAAKg5B,YAAY/5C,KAChB,CACDgnB,IAAK,SAAChnB,GACJA,EAAEutC,iBACFvtC,EAAE+I,qBAIN1P,KAAK2gD,qBAAuB3gD,KAAKwtB,KAAK,aAAcxtB,KAAK4gD,cACzD5gD,KAAK6gD,qBAAuB7gD,KAAKwtB,KAAK,aAAcxtB,KAAK8gD,cAEhC,WAAnB35B,GAAQhG,QAAmE,WAA3CnhB,KAAK4vB,aAAa2N,uBACjDtxB,KAAAA,KAAK,aAAcjM,KAAK2gD,sBAE7B3gD,KAAKiM,KAAK,CAAC,OAAQ,cAAejM,KAAK6gD,sBAEvC7gD,KAAKiM,KAAK,mBAAoB,YAAajM,KAAK+gD,gBAChD/gD,KAAKiM,KAAK,mBAAoB,YAAajM,KAAKghD,gBAChDhhD,KAAKiM,KAAK,mBAAoB,UAAWjM,KAAKy/C,eAGhDz/C,KAAKiM,KAAK,iBAAkB,CAAC,WAAY,SAAUjM,KAAKygD,oBAEnDllC,KAAAA,GAAG9B,EAAsBzZ,KAAKihD,gBAC9BtnC,KAAAA,KAAKF,EAAoBzZ,KAAKihD,gBAEP,WAAxBnrC,EAAKpO,OAAO+d,KACT9Q,KAAAA,OAAO8Q,OAASzlB,KAAKX,OAAO45B,SAGnCj5B,KAAKihD,oBACN,CAAA//C,IAAA,kBAAAC,MAiDD,SAAiBwL,EAAQnD,GACvB,IAAQmL,EAAW3U,KAAX2U,OACFusC,EAAOlhD,KAAKy1B,KAAK,kBACjB4pB,EAAMr/C,KAAKy1B,KAAK,iBAClB,GAAC4pB,GAAQ6B,EAAT,CAGEn9C,IAAAA,EAAM8J,SAASlB,EAAS0yC,EAAI9X,wBAAwB56B,OAAS,IAAM,IACzEu0C,EAAKl0C,MAAML,UAAMvM,OAAMuM,EAAU,MAC3Bi2B,IAAAA,EAAKz+B,KAAKK,IAAIL,KAAKC,IAAIL,EAAM,IAAM,GAAI,GACvC0+B,EAAQ,CACZhd,OAAQ,CACNkd,KAAMhuB,EAAO8Q,OACbmd,GAAAA,IAGAjuB,EAAO6Q,QACTid,EAAMjd,MAAQ,CACZmd,MAAM,EACNC,IAAI,IAGHpS,KAAAA,eAAehnB,EAAO,gBAAiB,CAAEgc,MAAO7Q,EAAO6Q,MAAOC,OAAQ9Q,EAAO8Q,OAAQgd,MAAAA,IACnFhd,EAAAA,OAASthB,KAAKK,IAAIL,KAAKC,IAAIL,EAAM,IAAM,GAAI,GAC3CyhB,EAAAA,QAAU7Q,EAAO6Q,OAAQ,GAE5BxlB,KAAKX,OAAOygD,gBACd9/C,KAAK+/C,uBAIT,CAAA7+C,IAAA,oBAAAC,MAKA,WACE,IAAAq9C,EAA0Bx+C,KAAK2U,OAAvB8Q,EAAM+4B,EAAN/4B,OAAQD,EAAKg5B,EAALh5B,MACV27B,EAAcnhD,KAAKy1B,KAAK,yBACxBhL,EAAMtmB,KAAKK,IAAIL,KAAKC,IAAIqhB,EAAQ,GAAI,GAK1C07B,EAAYC,UAAY57B,EAAQ,EAAIrhB,KAAKgF,MAAY,IAANshB,KAGjD,CAAAvpB,IAAA,QAAAC,MAGA,WACqBnB,KAAX2U,OACD+rB,MAAM,CAAEC,UAAU,IACrB3gC,KAAKsgD,WACF37C,EAAAA,aAAa3E,KAAMA,KAAKsgD,UAC7BtgD,KAAKsgD,SAAW,MAEbl6C,EAAAA,SAASpG,KAAKgT,KAAM,gBAG3B,CAAA9R,IAAA,UAAAC,MAOA,WAAyC,IAAAwmB,EAAA3nB,KAAhCkuC,EAAKvuC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,IAAK0hD,IAAO1hD,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GAASgH,EAAChH,UAAAC,OAAAD,EAAAA,kBAAA0D,EAC7Bq8C,EAAe1/C,KAAf0/C,GAAI/qC,EAAW3U,KAAX2U,OACR+qC,EAAGhjC,WAGH1c,KAAKsgD,WACF37C,EAAAA,aAAa3E,KAAMA,KAAKsgD,UAC7BtgD,KAAKsgD,SAAW,MAElBtgD,KAAKsgD,SAAWxqC,EAAKrS,WAAWzD,MAAM,WAC/B0/C,EAAGhjC,WACN2kC,EAAU1sC,EAAOysB,OAASzsB,EAAO+rB,QAC5Bv5B,EAAAA,YAAYwgB,EAAK3U,KAAM,cACzB2sC,EAAAA,SAAWh4B,EAAK83B,aAAa94C,IAElCghB,EAAK24B,SAAW,OACfpS,MACJ,CAAAhtC,IAAA,cAAAC,MAkBD,SAAawF,GAEXA,GAAKA,EAAE+I,kBACP,IAAQiF,EAAe3U,KAAf2U,OAAe3U,KAAP0/C,GAEbC,SAAW3/C,KAAKy/C,aAAa94C,GAC3B6pB,KAAAA,eAAe7pB,EAAG,eAAgB,CACrC6e,MAAO7Q,EAAO6Q,MACdC,OAAQ9Q,EAAO8Q,OACfgd,MAAO,CACLjd,MAAO,CACLmd,KAAMhuB,EAAO6Q,MACbod,IAAKjuB,EAAO6Q,UAId7Q,EAAO8Q,OAAS,IACXD,EAAAA,OAAS7Q,EAAO6Q,OAErB7Q,EAAO8Q,OAAS,MACXA,EAAAA,OAASzlB,KAAKX,OAAOiiD,cAE/B,CAAApgD,IAAA,UAAAC,MAgBD,SAASqkB,EAAOC,GACVD,GAAoB,IAAXC,EACNuP,KAAAA,QAAQ,aAAc,QAClBvP,EAAS,IAAOzlB,KAAK2zB,MAAMqsB,YAC/BhrB,KAAAA,QAAQ,aAAc,SAEtBA,KAAAA,QAAQ,aAAc,YAE9B,CAAA9zB,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,iBAAkB0gB,EAAMqsB,aACpC/sC,KAAAA,YAAY,iBAAkB0gB,EAAMusB,aACpCjtC,KAAAA,YAAY,iBAAkB0gB,EAAMysB,eAC1C,CAAAl/C,IAAA,UAAAC,MAED,WACMnB,KAAKsgD,WACF37C,EAAAA,aAAa3E,KAAMA,KAAKsgD,UAC7BtgD,KAAKsgD,SAAW,MAEbhf,KAAAA,OAAO,aAActhC,KAAK4gD,cAE/B5gD,KAAKshC,OAAO,CAAC,OAAQ,cAAethC,KAAK8gD,cAEzC9gD,KAAKshC,OAAO,mBAAoB,YAAathC,KAAK+gD,gBAClD/gD,KAAKshC,OAAO,mBAAoB,YAAathC,KAAKghD,gBAClDhhD,KAAKshC,OAAO,mBAAoB,UAAWthC,KAAKy/C,cACvCr3B,SAAAA,oBAAoB,UAAWpoB,KAAKy/C,cACxCne,KAAAA,OAAO,iBAAqC,WAAnBna,GAAQhG,OAAsB,WAAa,QAASnhB,KAAKygD,sBACxF,CAAAv/C,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAAZ,CAGJ,IAAM/P,EAASzlB,KAAKX,OAAO45B,SAAWj5B,KAAK2U,OAAO8Q,OAC5C87B,EAAoBvhD,KAAKX,OAAOygD,eACtC,MAAA,oKAAA1/C,OAKMmhD,EAAiBnhD,qCAAAA,OAAiD,IAATqlB,EAAY,UAAW,GAAErlB,kGAAAA,OAEzB,IAATqlB,EAAY,yEAInE,CAAA,CAAAvkB,IAAA,aAAAK,IA1TD,WACS,MAAA,WAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPo0B,SAAS,EACTsqB,gBAAgB,EAChB7mB,QAAS,GACTqoB,WAAY,QAEflC,GAjBkBprB,ICfrB,SAASjwB,KACA,OAAA,IAAID,MAAOsO,UAGpB,IAAMovC,GACQ,YADRA,GAES,aAFTA,GAGS,aAHTA,GAIQ,eAJRA,GAKM,aALNA,GAMQ,YANRA,GAOM,UAENC,YAAQxtB,GAAAhY,EAAAwlC,EAAAxtB,GAAA/X,IAAAA,EAAAC,EAAAslC,GAAA,SAAAA,IAAAr7B,IAAAA,EAAAplB,OAAAygD,GAAA,IAAA,IAAA/hD,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAkNXqmB,OAlNW6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,sBAqGI,WACdijB,EAAK4d,OAAO0d,cAAe,EACvBt7B,EAAK4d,OAAO2d,gBACdviD,EAASG,QAAO,aAAAa,OAAcgmB,EAAKzR,OAAOyH,SAAQ,mBAClDgK,EAAKw7B,QAAQ,oBAEhB35B,EAAAuY,EAAApa,uBAEkB,WACjBhnB,EAASG,QAAO,aAAAa,OAAcgmB,EAAKzR,OAAOyH,SAAQ,sBAClDgK,EAAK4d,OAAO2d,eAAgB,EACvBE,EAAAA,IAAMz7B,EAAKw7B,QAAQ,sBACzB35B,EAAAuY,EAAApa,eAEU,WACTA,EAAK4d,OAAS,CACZ2d,eAAe,EACfG,aAAa,EACbJ,cAAc,EACdK,UAAU,EACVC,MAAM,GAER57B,EAAKy7B,GAAK,EACVz7B,EAAK67B,GAAK,EACV77B,EAAK87B,IAAM,EACX97B,EAAK+7B,aAAep+C,KACpBqiB,EAAKg8B,eAAiB,EACtBh8B,EAAKi8B,cAAgB,EACrBj8B,EAAKk8B,YAAa,EAClBl8B,EAAKm8B,aAAe,EACpBn8B,EAAKo8B,aAAe,EACpBp8B,EAAKq8B,kBAAoB,EACzBr8B,EAAKs8B,YAAa,EAClBt8B,EAAKu8B,YAAc7sC,EAAKnR,aAAY67B,EAAApa,GAAOA,EAAKu8B,YAChDv8B,EAAKw8B,aAAe9sC,EAAKnR,aAAY67B,EAAApa,GAAOA,EAAKw8B,aACjDx8B,EAAKu8B,WAAa,KAClBv8B,EAAKw8B,YAAc,KACnBx8B,EAAKy8B,UAAY,KAClB56B,EAAAuY,EAAApa,iBAEY,WACPA,EAAKm8B,eAGTn8B,EAAK08B,qBAAqB,QAC1B18B,EAAKm8B,aAAex+C,KACfg/C,EAAAA,QAAQvB,GAAsB,CAAEngD,MAAO0C,WAC7CkkB,EAAAuY,EAAApa,gBAEW,WACVA,EAAK48B,qBAAqB,aAC3B/6B,EAAAuY,EAAApa,0BAEqB,WAChBA,EAAKs8B,YAAct8B,EAAKy7B,KAG5Bz7B,EAAKs8B,YAAa,EAClBt8B,EAAKo8B,aAAez+C,KACpBqiB,EAAKq8B,kBAAoB1+C,KACzBqiB,EAAKy8B,UAAY,EACZE,EAAAA,QAAQvB,GAAsB,CAAEyB,WAAY78B,EAAKq8B,kBAAmBphD,MAAO+kB,EAAKo8B,aAAc1gD,KAAM,EAAG+sC,QAAS,kBACtH5mB,EAAAuY,EAAApa,iBAEY,YAEPA,EAAKs8B,YAAet8B,EAAKy7B,KAI7Bz7B,EAAKs8B,YAAa,EACbt8B,EAAKy7B,GAECz7B,EAAKm8B,aACdn8B,EAAKy8B,UAAY,EAEjBz8B,EAAKy8B,UAAY,EAJjBz8B,EAAKy8B,UAAY,EAOnBz8B,EAAKq8B,kBAAoB1+C,KACzBqiB,EAAKu8B,WAAa7sC,EAAKrS,WAAU+8B,EAAApa,IAAO,WAClCA,EAAKs8B,aACPt8B,EAAKo8B,aAAez+C,KACpB+R,EAAKnR,aAAY67B,EAAApa,GAAOA,EAAKu8B,YAC7Bv8B,EAAKu8B,WAAa,KAClBv8B,EAAK88B,oBACAH,EAAAA,QAAQvB,GAAsB,CAAEyB,WAAY78B,EAAKq8B,kBAAmBphD,MAAO+kB,EAAKo8B,aAAc1gD,KAAMskB,EAAKy8B,UAAWhU,QAA4B,IAAnBzoB,EAAKy8B,UAAkB,OAAS,eAEnK,SACJ56B,EAAAuY,EAAApa,eAEU,WACTA,EAAK48B,qBAAqB,SAC1B58B,EAAK08B,qBAAqB,YAC3B76B,EAAAuY,EAAApa,iBAaY,WACNs8B,EAAAA,YAAct8B,EAAK08B,qBAAqB,cAC9C18B,EAzMAq7B,OAyMAxgD,EAAAwgD,EAAA,CAAA,CAAAvgD,IAAA,cAAAC,MAvMD,WAAe,IAAAumB,EAAA1nB,KACbA,KAAKmjD,WACLnjD,KAAK6iD,UAAY,aAEjB7iD,KAAKojD,kBAELpjD,KAAKmiD,aAAep+C,KAEpB/D,KAAKoiD,eAAiB,EAEtBpiD,KAAKqiD,cAAgB,EAEhB9mC,KAAAA,GAAG9B,GAAmB,WACzB,IAAQuqB,EAAWtc,EAAXsc,OACA2d,EAA4B3d,EAA5B2d,cAAeI,EAAa/d,EAAb+d,SAClBM,EAAAA,cAAgBt+C,KAAQ2jB,EAAKy6B,aACzB5iD,EAAAA,QAAOa,aAAAA,OAAcsnB,EAAK/S,OAAOyH,SAAQhc,eAAAA,iBAAAA,OAAgCuhD,EAAa,cAAAvhD,OAAa2hD,EAAQ,mBAAA3hD,OAAkBsnB,EAAK26B,cAAajiD,iBAAAA,OAAgBsnB,EAAKy6B,eACzKJ,KAGH/d,EAAOge,MAAQt6B,EAAKq7B,QAAQvB,GAAsB,IACnDxd,EAAOge,MAAO,EACdhe,EAAO0d,cAAe,EACtB1d,EAAO8d,aAAc,EACrBp6B,EAAKu6B,GAAKl+C,KACV2jB,EAAKm6B,GAAK,EACVn6B,EAAKw6B,IAAM,EACXx6B,EAAK07B,kBACL17B,EAAK27B,0BAGF9nC,KAAAA,GAAG9B,GAAoB,WAC1BiO,EAAKm6B,GAAK99C,KACLm+C,EAAAA,IAAMx6B,EAAKm6B,GAAKn6B,EAAKu6B,GACrBG,EAAAA,eAAiB16B,EAAKm6B,GAAKn6B,EAAKy6B,aACrCmB,IAAAA,EAAkD57B,EAAKsc,OAA/C0d,EAAY4B,EAAZ5B,aAAcK,EAAQuB,EAARvB,SAAUJ,EAAa2B,EAAb3B,cACvBpiD,EAAAA,QAAOa,aAAAA,OAAcsnB,EAAK/S,OAAOyH,SAAQhc,gBAAAA,OAAAA,OAAuBsnB,EAAKw6B,IAAG,kBAAA9hD,OAAiBsnB,EAAKsc,OAAO0d,aAAYthD,oBAAAA,OAAmBsnB,EAAK06B,kBAC9IV,GAAgBC,IAClBj6B,EAAKk6B,QAAQ,cAEVG,GACHr6B,EAAKq7B,QAAQvB,GAAuB,IAEtC95B,EAAKo7B,qBAAqB,iBAGvBvnC,KAAAA,GAAG9B,EAAgBzZ,KAAKujD,YACxBhoC,KAAAA,GAAG9B,EAAezZ,KAAKwjD,WAEvBjoC,KAAAA,GAAG9B,IAAgB,WACtBiO,EAAK+7B,SAAS,cAGXloC,KAAAA,GAAG9B,IAAmB,WACzBiO,EAAK+7B,SAAS,aACdrkD,EAASG,QAAO,aAAAa,OAAcsnB,EAAK/S,OAAOyH,SAAQ,gBAC7C4nB,EAAAA,OAAO+d,UAAYr6B,EAAKy7B,cAG/BnjD,KAAKub,GAAG,CAAC9B,EAAgBA,GAAiBzZ,KAAK0jD,YAE1CnoC,KAAAA,GAAG9B,EAAgBzZ,KAAK2jD,YACxBpoC,KAAAA,GAAG9B,EAAczZ,KAAK4jD,UACtBroC,KAAAA,GAAG9B,IAAc,WACpBra,EAASG,QAAO,aAAAa,OAAcsnB,EAAK/S,OAAOyH,SAAQ,WAClDsL,EAAK+7B,SAAS,SACd/7B,EAAK07B,kBACL17B,EAAKy7B,gBAER,CAAAjiD,IAAA,kBAAAC,MAED,WACOsa,KAAAA,IAAIhC,GAAyBzZ,KAAK6jD,kBAClCpoC,KAAAA,IAAIhC,EAAoBzZ,KAAK8jD,eAC7BnqC,KAAAA,KAAKF,GAAyBzZ,KAAK6jD,kBACnClqC,KAAAA,KAAKF,EAAoBzZ,KAAK8jD,iBACpC,CAAA5iD,IAAA,UAAAC,MAED,SAAS0tC,GACP7uC,KAAK+jD,EAAIhgD,KACT,IAAAigD,EAAkChkD,KAAKgkC,OAA/B8d,EAAWkC,EAAXlC,YAAaC,EAAQiC,EAARjC,SACZxiD,EAAAA,QAAOa,aAAAA,OAAcJ,KAAK2U,OAAOyH,SAAQhc,YAAAA,GAAAA,OAAeyuC,EAAO,SAAAzuC,OAAQJ,KAAKkiD,IAAG,iBAAA9hD,OAAgB0hD,EAAW,eAAA1hD,QAAe2hD,IAC9H/hD,KAAK6hD,GAAK,GAAKC,IAAgBC,IACxBxiD,EAAAA,QAAOa,aAAAA,OAAcJ,KAAK2U,OAAOyH,SAA+ByyB,uBAAAA,GACzE7uC,KAAKgkC,OAAO8d,aAAc,EAC1B9hD,KAAKgkC,OAAO+d,UAAW,EAClBgB,KAAAA,QAAQvB,GAAuB,CAAEU,IAAKliD,KAAKkiD,IAAK+B,SAAUjkD,KAAKkiD,IAAKL,GAAI7hD,KAAK6hD,GAAIQ,cAAeriD,KAAKqiD,cAAeD,eAAgBpiD,KAAKoiD,oBAEjJ,CAAAlhD,IAAA,oBAAAC,MAkGD,WAAqB,IAAAwmB,EAAA3nB,KACfA,KAAK4iD,aACFj+C,EAAAA,aAAa3E,KAAMA,KAAK4iD,aAE/B5iD,KAAK4iD,YAAc9sC,EAAKrS,WAAWzD,MAAM,WACvC2nB,EAAKm7B,qBAAqB,WACrBn+C,EAAAA,aAAagjB,EAAMA,EAAKi7B,aAC7Bj7B,EAAKi7B,YAAc,OAClB5iD,KAAKX,OAAO6kD,eAChB,CAAAhjD,IAAA,WAAAC,MAMD,SAAU0tC,GACR7uC,KAAK8iD,qBAAqBjU,GAC1B7uC,KAAKgjD,qBAAqBnU,KAC3B,CAAA3tC,IAAA,uBAAAC,MAED,SAAsB0tC,GAChB,GAAC7uC,KAAKuiD,aAAN,CAGJ,IAAM4B,EAAOpgD,KACPqgD,EAAQD,EAAOnkD,KAAKuiD,aAC1BviD,KAAKuiD,aAAe,EACfQ,KAAAA,QAAQvB,GAAoB,CAAElgD,IAAK6iD,EAAMF,SAAUG,EAAOvV,QAAAA,OAChE,CAAA3tC,IAAA,uBAAAC,MAED,SAAsB0tC,GAUhB,GATA7uC,KAAK2iD,aACFh+C,EAAAA,aAAa3E,KAAMA,KAAK2iD,YAC7B3iD,KAAK2iD,WAAa,MAEhB3iD,KAAK4iD,cACFj+C,EAAAA,aAAa3E,KAAMA,KAAK4iD,aAC7B5iD,KAAK4iD,YAAc,MAErB5iD,KAAK0iD,YAAa,EACb1iD,KAAKwiD,aAAN,CAGJ,IAAM2B,EAAOpgD,KACPqgD,EAAQD,EAAOnkD,KAAKwiD,aACpB6B,EAAaF,EAAOnkD,KAAKyiD,kBACvByB,EAAgBlkD,KAAKX,OAArB6kD,YACRlkD,KAAK0iD,YAAa,EAClB1iD,KAAKwiD,aAAe,EACpBxiD,KAAKyiD,kBAAoB,EACpBM,KAAAA,QAAQvB,GAAoB,CAC/B8C,cAAeD,EAAaH,EAAcA,EAAcG,EACxDJ,SAAUG,EAAQF,EAAcA,EAAcE,EAC9CtiD,KAAkB,eAAZ+sC,EAA2B,EAAI7uC,KAAK6iD,UAC1ChU,QAA4B,IAAnB7uC,KAAK6iD,UAAkB,OAAShU,OAE5C,CAAA3tC,IAAA,UAAAC,MAED,SAASw0B,EAAW/K,GAClB,IAAQjW,EAAW3U,KAAX2U,OACHoG,KAAAA,KAAKtB,GAAY8W,EAAA,CACpB0G,EAAGlzB,KACH8R,KAAMC,EAAKzE,eAAesD,EAAO5C,YACjC2T,MAAO/Q,EAAO+Q,MACdiQ,UAAAA,EACAzhB,YAAalU,KAAK2U,OAAOT,YACzBqB,WAAYZ,EAAO/C,MAAM2D,WACzBC,aAAcb,EAAO/C,MAAM4D,cACxBoV,OAEN,CAAA,CAAA1pB,IAAA,aAAAK,IA1QD,WACS,MAAA,aACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACL2iD,YAAa,SAEhBzC,GAToBlyB,2vCCXjBg1B,YAAMhkB,GAAAtkB,EAAAsoC,EAAAhkB,GAAArkB,IAAAA,EAAAC,EAAAooC,GAAA,SAAAA,IAAAroC,OAAAlb,OAAAujD,GAAAroC,EAAA/b,MAAAH,KAAAL,WAST4kD,OATStjD,EAAAsjD,EAAA,CAAA,CAAArjD,IAAA,gBAAAC,MAWV,WACS,MAAA,CACLi1C,OAAQoO,MAEX,CAAAtjD,IAAA,cAAAC,MAED,WAAe,IAAAilB,EAAApmB,KACbg0B,GAAOe,OAAO/0B,KAAK2zB,MAAMyiB,OAAQp2C,KAAKgT,KAAM,GAC5ChT,KAAKykD,eAAiBzkD,KAAKwtB,KAAK,eAAe,WAC7CpH,EAAKzR,OAAOyhC,WACX,CACDzoB,IAAK,SAAChnB,GACJA,EAAEutC,iBACFvtC,EAAE+I,qBAIN1P,KAAKiM,KAAK,mBAAoB,CAAC,QAAS,YAAajM,KAAKykD,gBAIrDlpC,KAAAA,GAAG9B,GAAc,WAIhB2M,GAHCA,EAAKwJ,aAAaxI,MACrBtR,EAAK1P,SAASggB,EAAKzR,OAAO3B,KAAM,WAE9BoT,EAAK/mB,OAAOm2B,QAAZpP,CAGJA,EAAK7X,OACL,IAAMm2C,EAAOt+B,EAAKpT,KAAKhL,cAAc,QACrC,GAAI08C,EAAM,CACR,IAAM3U,EAAYpxC,OAAO2J,iBAAiBo8C,GAAMxuB,iBAAiB,aACjE,GAAyB,iBAAd6Z,GAA0BA,EAAUjxC,QAAQ,SAAc,EAC5D,OAAA,KAEFgH,EAAAA,aAAa,YAAaiqC,QAKhCx0B,KAAAA,GAAG9B,GAAa,WACnB2M,EAAK/X,YAER,CAAAnN,IAAA,eAAAC,MAED,SAAcwF,GACZA,EAAEutC,iBACFvtC,EAAE+I,kBACF1P,KAAK2U,OAAOyhC,SACZtgC,EAAK3O,YAAYnH,KAAK2U,OAAO3B,KAAM,YAGrC,CAAA9R,IAAA,OAAAC,MAIA,SAAMA,GACAnB,KAAKX,OAAOm2B,UAGXxiB,KAAAA,KAAKhG,MAAMsB,QAAU,UAC3B,CAAApN,IAAA,SAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,IACvB,CAAAt0B,IAAA,UAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,EACtBx1B,KAAKqO,SACN,CAAAnN,IAAA,UAAAC,MAED,WACEnB,KAAKshC,OAAO,mBAAoB,CAAC,QAAS,YAAathC,KAAKykD,kBAC7D,CAAAvjD,IAAA,SAAAC,MAED,WACE,MAAA,mGAAAf,OACyDJ,KAAKgwB,SAASvY,OAAMrX,MAAAA,OAAKJ,KAAKoV,KAAKqC,OAAM,yCAEnG,CAAA,CAAAvW,IAAA,aAAAK,IA1FD,WACS,MAAA,WACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLi0B,SAAS,OAEZ+uB,GATkBvwB,ICOf2wB,YAAMpkB,GAAAtkB,EAAA0oC,EAAApkB,GAAArkB,IAAAA,EAAAC,EAAAwoC,GAAA,SAAAA,IAAAzoC,OAAAlb,OAAA2jD,GAAAzoC,EAAA/b,MAAAH,KAAAL,WAiBTglD,OAjBS1jD,EAAA0jD,EAAA,CAAA,CAAAzjD,IAAA,cAAAK,IAuBV,WACE,OAAOvB,KAAKX,OAAOulD,aACpBn7B,IAND,SAAiBtoB,GACfnB,KAAKX,OAAOulD,YAAczjD,IAC3B,CAAAD,IAAA,OAAAC,MAMD,WACOnB,KAAK6kD,SACH7kD,KAAKX,OAAOylD,gBACV1+C,EAAAA,SAASpG,KAAKgT,KAAM,QAE3BhT,KAAK6kD,QAAS,KAIlB,CAAA3jD,IAAA,OAAAC,MAGA,WACEnB,KAAK6kD,QAAS,EACT7kD,KAAKX,OAAOylD,gBACV39C,EAAAA,YAAYnH,KAAKgT,KAAM,UAE/B,CAAA9R,IAAA,eAAAC,MAED,SAAcgC,GAC6B,iBAA9BA,EAAKwR,OAAOtV,OAAOi+B,SAC5Bn6B,EAAK9D,OAAOi+B,OAASn6B,EAAKwR,OAAOtV,OAAOi+B,UAE3C,CAAAp8B,IAAA,cAAAC,MAED,WAAe,IAAAilB,EAAApmB,KAETA,KAAKX,OAAOylD,gBAAkB9kD,KAAKX,OAAOi+B,SAC5Ct9B,KAAK2U,OAAO9C,MAAMyrB,OAASt9B,KAAKX,OAAOi+B,QAGpC/hB,KAAAA,GAAG9B,GAAc,WAChB2M,EAAKw+B,aACPx+B,EAAK7X,UAIJgN,KAAAA,GAAG9B,GAAgB,WACtB2M,EAAK/X,UAGHrO,KAAKX,OAAO0lD,aACTprC,KAAAA,KAAKF,GAAoB,WAC5B2M,EAAKy4B,kBAEFtjC,KAAAA,GAAG9B,IAAmB,WACzB2M,EAAK7X,OACA6X,EAAK/mB,OAAOylD,gBACV1+C,EAAAA,SAASggB,EAAKpT,KAAM,eAEtB2G,EAAAA,KAAKF,GAAoB,WAC5B2M,EAAKy4B,sBAIJtjC,KAAAA,GAAG9B,GAAa,WACnB2M,EAAK/X,YAGV,CAAAnN,IAAA,eAAAC,MAED,WAAgB,IAAAumB,EAAA1nB,KACTA,KAAK2U,OAAOT,YAKV/M,EAAAA,YAAYnH,KAAKgT,KAAM,eAJvB2G,KAAAA,KAAKF,GAAoB,WAC5BiO,EAAKm3B,oBAKV,CAAA39C,IAAA,YAAAC,MAED,SAAW9B,GAAQ,IAAAsoB,EAAA3nB,KACjB0F,OAAOC,KAAKtG,GAAQuG,SAAQ,SAAA1E,GACrB7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,MAEpBo8B,IAAAA,EAAWt9B,KAAKX,OAAhBi+B,OACRt9B,KAAK6yC,OAAOvV,KACb,CAAAp8B,IAAA,SAAAC,MAED,SAAQm8B,GACDA,IAGLt9B,KAAKX,OAAOi+B,OAASA,EACjBt9B,KAAKX,OAAOylD,eACTnwC,KAAAA,OAAO9C,MAAMyrB,OAASA,EAE3Bt9B,KAAKgT,KAAKhG,MAAM9B,gBAAe9K,OAAAA,OAAUk9B,EAAS,QAErD,CAAAp8B,IAAA,YAAAC,MAED,SAAWs1B,GACT,IAAIuuB,EAAM,GACFvuB,OAAAA,GACD,IAAA,QACGuuB,EAAA,QACN,MACG,IAAA,UACGA,EAAA,UACN,MACG,IAAA,YACGA,EAAA,YACN,MAAA,QAEMA,EAAA,GAEV,OAAOA,EAAG5kD,oBAAAA,OAAuB4kD,OAAS,KAC3C,CAAA9jD,IAAA,SAAAC,MAED,WACE,IAAAy/B,EAAqE5gC,KAAKX,OAAlEi+B,EAAMsD,EAANtD,OAAQynB,EAAWnkB,EAAXmkB,YAAaE,EAAQrkB,EAARqkB,SAAUC,EAAStkB,EAATskB,UACvC,GADgEtkB,EAAdkkB,eAEzC,MAAA,GAEHE,IAAAA,EAAMhlD,KAAKmlD,UAAUF,GACrBj4C,EAAQswB,EAAM,wBAAAl9B,OAA2Bk9B,EAAM,MAAAl9B,OAAK4kD,GAAQA,EAElE,MAAA,qCAAA5kD,OADkB8kD,EAAY,gBAAmBH,EAAc,cAAgB,GAC1B3kD,aAAAA,OAAY4M,EAAK,2BAEvE,CAAA,CAAA9L,IAAA,aAAAK,IAjJD,WACS,MAAA,WAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLqjD,aAAa,EACbG,aAAa,EACbG,WAAW,EACX5nB,OAAQ,GACRwnB,gBAAgB,EAChBG,SAAU,gBAEbN,GAjBkB3wB,ICIfoxB,GAAa,GAenB,SAASC,GAAgB3gD,GACnBA,EACF/F,OAAOgG,aAAaD,GAGtBgB,OAAOC,KAAKy/C,IAAYx9C,KAAI,SAAA1G,GACnByD,OAAAA,aAAaygD,GAAWlkD,GAAKwD,WAC7B0gD,GAAWlkD,MAKhBokD,IAAAA,YAAK/kB,GAAAtkB,EAAAqpC,EAAA/kB,GAAArkB,IAAAA,EAAAC,EAAAmpC,GAiBT,SAAAA,EAAaniD,GAAMijB,IAAAA,EAESA,OAFTplB,OAAAskD,GACNr9B,EAAAuY,EAAXtkB,EAAAA,EAAAzV,UAAMtD,qBAuEQ,WACdijB,EAAKm/B,eAAgB,EACrB,IAAM//C,EAAiC,SAArB4gB,EAAK/mB,OAAOo3B,KAAkB,YAAc,OACzDzB,EAAAA,QAAQ,aAAc,QACtB7tB,EAAAA,YAAYif,EAAKpT,KAAMxN,GAC5B4gB,EAAK7X,UACN0Z,EAAAuY,EAAApa,sBAEiB,WAChB,IAAIA,EAAKm/B,cAAT,CAGA,IAAM//C,EAAiC,SAArB4gB,EAAK/mB,OAAOo3B,KAAkB,YAAc,OACzDrwB,EAAAA,SAASggB,EAAKpT,KAAMxN,GACzB4gB,EAAKm/B,eAAgB,EACrBn/B,EAAKo/B,SAAS,YArFdp/B,EAAKm/B,eAAgB,EAAKn/B,EAJ3Bk/B,OAKArkD,EAAAqkD,EAAA,CAAA,CAAApkD,IAAA,cAAAC,MAED,WACE,IAAQyuB,EAAiB5vB,KAAjB4vB,aAER5vB,KAAK6zC,YACL7zC,KAAKq2C,eACLr2C,KAAKylD,kBAEA71B,EAAanJ,UAChBzmB,KAAKuO,SAIT,CAAArN,IAAA,eAAAC,MAIA,WAAgB,IAAAumB,EAAA1nB,KACN2U,EAAyB3U,KAAzB2U,OAAQib,EAAiB5vB,KAAjB4vB,aAEXjW,KAAAA,KAAKF,GAAc,WAClBmW,IACEA,EAAa7S,MAA8B,OAAtB6S,EAAa7S,KAC/B3W,EAAAA,SAASuO,EAAO3B,KAAM,cACI,OAAtB4c,EAAa7S,MACjB3W,EAAAA,SAASuO,EAAO3B,KAAM,kBAK5BuI,KAAAA,GAAG9B,GAAyBzZ,KAAK0lD,iBAEjCnqC,KAAAA,GAAG9B,IAA2B,WACjC,IAAMjU,EAAiC,SAArBkiB,EAAKroB,OAAOo3B,KAAkB,YAAc,OACzDzB,EAAAA,QAAQ,aAAc,QACtB7tB,EAAAA,YAAYugB,EAAK1U,KAAMxN,GAC5BkiB,EAAKnZ,UAGFgN,KAAAA,GAAG9B,GAAa,WACnBiO,EAAK89B,SAAS,WAGXjqC,KAAAA,GAAG9B,GAAc,WACpBiO,EAAK89B,SAAS,YAGXjqC,KAAAA,GAAG9B,IAAc,WACpBiO,EAAKi+B,qBAIT,CAAAzkD,IAAA,kBAAAC,MAGA,WAAmB,IAAAwmB,EAAA3nB,KACjBA,KAAK4lD,aAAe5lD,KAAKwtB,KAAK,aAAcxtB,KAAK6lD,gBAAiB,CAChEl4B,IAAK,SAAChnB,GACFm/C,EAAAA,YAAcn/C,EAAEutC,iBAClBvtC,EAAE+I,kBACM2V,IAAAA,EAAWsC,EAAKhT,OAAhB0Q,OACHmL,EAAAA,eAAe7pB,EAAG,oBAAqB,CAAE87B,MAAO,SAAUE,KAAMtd,EAAQud,IAAKvd,OAItFrlB,KAAKiM,KAAK,CAAC,QAAS,YAAajM,KAAK4lD,gBACvC,CAAA1kD,IAAA,gBAAAC,MAoBD,WACS,MAAA,CACL4kD,UAAW,CAAE3yB,KAAMkjB,GAASziB,MAAO,gBACnCmyB,WAAY,CAAE5yB,KAAMmjB,GAAU1iB,MAAO,oBAExC,CAAA3yB,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,iBAAkB0gB,EAAMoyB,WACpC9yC,KAAAA,YAAY,iBAAkB0gB,EAAMqyB,cAC1C,CAAA9kD,IAAA,OAAAC,MAED,WACOiF,EAAAA,SAASpG,KAAKgT,KAAM,UAG3B,CAAA9R,IAAA,OAAAC,MAIA,SAAMA,GACCgG,EAAAA,YAAYnH,KAAKgT,KAAM,UAC7B,CAAA9R,IAAA,YAAAC,MAED,WACOiF,EAAAA,SAASpG,KAAKgT,KAAM,gBAC1B,CAAA9R,IAAA,UAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,gBAC7B,CAAA9R,IAAA,eAAAC,MAED,SAAc8kD,GACRA,EACFjmD,KAAKg1B,QAAQ,aAAeh1B,KAAK2U,OAAO0Q,OAAkB,QAAT,QAEjDrlB,KAAKg1B,QAAQ,aAAch1B,KAAK2U,OAAO0Q,OAAS,OAAS,WAE5D,CAAAnkB,IAAA,UAAAC,MAED,SAAS+kD,GAAS,IAAAt+B,EAAA5nB,KACXmmD,KAAAA,WA/KAC,SAAYllD,EAAKmlD,GAASr1C,IAAAA,EAAQrR,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAE0B,MAAO,KAAMC,IAAK,MAWhE,OAVI8jD,GAAWlkD,IACNyD,OAAAA,aAAaygD,GAAWlkD,GAAKwD,IAEtC0gD,GAAWlkD,GAAO,GACTG,EAAAA,OAAS2P,EAAS3P,QAC3B+jD,GAAWlkD,GAAKwD,GAAK/F,OAAO8E,YAAW,WAC5BnC,EAAAA,KAAO0P,EAAS1P,MAClBqD,OAAAA,aAAaygD,GAAWlkD,GAAKwD,WAC7B0gD,GAAWlkD,KACjBmlD,GACIjB,GAAWlkD,GAAKwD,GAoKH0hD,CAAW,YAAa,IAAK,CAC7C/kD,MAAO,WACA+E,EAAAA,SAASwhB,EAAK5U,KAAM,YACzB4U,EAAKrZ,OACLqZ,EAAK0+B,cAAa,IAEpBhlD,IAAK,WACE6F,EAAAA,YAAYygB,EAAK5U,KAAM,aAC3BkzC,GAAWt+B,EAAKvZ,OACjBuZ,EAAKu+B,WAAa,UAGvB,CAAAjlD,IAAA,aAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,YAC5BqyC,GAAerlD,KAAKmmD,YACpBnmD,KAAKmmD,WAAa,OAGpB,CAAAjlD,IAAA,kBAAAC,MAGA,SAAiBwF,GACf,IAAQgO,EAAW3U,KAAX2U,QACNmxC,EAAAA,YAAcn/C,EAAEutC,iBAClBvtC,EAAE+I,kBACEiF,EAAO+xB,MAAQtG,MAGJpgC,KAAK2U,OAAO0Q,QACZ1Q,EAAO+xB,QAAUtG,GAG9BzrB,EAAO+U,OAFP/U,EAAO4U,WAMX,CAAAroB,IAAA,cAAAC,MAGA,SAAaspC,GACXzqC,KAAKwlD,SAAS/a,KAGhB,CAAAvpC,IAAA,WAAAC,MAGA,SAAUspC,GACR,IAAQprC,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACZ,GAACA,KAAUA,EAAO+xB,MAAQtG,KAAmBpgC,KAAKulD,cAAlD,CAIAlmD,GAAgB,SAAhBA,EAAOo3B,KAGT,OAFAz2B,KAAKsmD,oBACLtmD,KAAKuO,OAKHlP,GAAgB,SAAhBA,EAAOo3B,KAAPp3B,CAKCA,GAAAA,EAAOknD,aAAe5xC,EAAO0Q,SAAW1Q,EAAOU,OAAWhW,EAAOmnD,WAAa7xC,EAAOU,MAIxF,OAHArV,KAAKsmD,eACLtmD,KAAKuO,YACLvO,KAAKymD,aAIP,GAAIpnD,EAAOqnD,eAGT,OAFA1mD,KAAKsmD,oBACLtmD,KAAKqO,OAIP,GAAe,SAAXo8B,EACFzqC,KAAKulD,cAAgBvlD,KAAK+zC,UAAY/zC,KAAKqO,WACtC,CACL,IAAKrO,KAAKulD,eAAiB5wC,EAAOU,MAChC,OAEFrV,KAAK+zC,gBAvBL/zC,KAAKsmD,kBAyBR,CAAAplD,IAAA,UAAAC,MAED,WACEnB,KAAKshC,OAAO,CAAC,QAAS,YAAathC,KAAK4lD,cACxCP,GAAerlD,KAAKmmD,cACrB,CAAAjlD,IAAA,SAAAC,MAED,WACQqE,IAAAA,EAAYxF,KAAK4vB,aAAanJ,SAAiC,SAArBzmB,KAAKX,OAAOo3B,KAAkB,YAAc,OAAU,GACtGr2B,MAAAA,yCAAAA,OACkCoF,EAAS,iEAG5C,CAAA,CAAAtE,IAAA,aAAAK,IAxPD,WACS,MAAA,UAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLglD,aAAa,EACbC,WAAW,EACXE,gBAAgB,EAChBjwB,KAAM,YAET6uB,GAfiBtxB,IChCd2yB,YAAKpmB,GAAAtkB,EAAA0qC,EAAApmB,GAAArkB,IAAAA,EAAAC,EAAAwqC,GAAA,SAAAA,IAAAzqC,OAAAlb,OAAA2lD,GAAAzqC,EAAA/b,MAAAH,KAAAL,WAaRgnD,OAbQ1lD,EAAA0lD,EAAA,CAAA,CAAAzlD,IAAA,SAAAC,MAeT,WACUylD,IAAAA,EAAc5mD,KAAKX,OAAnBunD,UACF5zC,EAAO8C,EAAK9Q,UAAU,WAAY,GAAI,GAAI,kBAE5C4hD,GAAAA,GAAaA,aAAqBjoD,OAAOkoD,YAC3C7zC,EAAKC,YAAY2zC,QACRA,GAAAA,GAAkC,iBAAdA,EAC7B5zC,EAAKvN,UAAYmhD,MACZ,CAEL,IADA,IAAIE,EAAS,GACJnlD,EAAI,EAAGA,GAAK,GAAIA,IACjBvB,GAAAA,iCAAAA,OAAqCuB,EAAW,YAExDqR,EAAKvN,UAAS,uCAAArF,OAA0C0mD,EAAc,UAEjE9zC,OAAAA,KACR,CAAA,CAAA9R,IAAA,aAAAK,IA9BD,WACS,MAAA,UAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLqlD,UAAW,GACXG,KAAM,QAETJ,GAbiB3yB,ICRdgzB,YAAczmB,GAAAtkB,EAAA+qC,EAAAzmB,GAAArkB,IAAAA,EAAAC,EAAA6qC,GAAA,SAAAA,IAAA9qC,OAAAlb,OAAAgmD,GAAA9qC,EAAA/b,MAAAH,KAAAL,WAUjBqnD,OAViB/lD,EAAA+lD,EAAA,CAAA,CAAA9lD,IAAA,cAAAC,MAYlB,WACEnB,KAAKinD,QAAUjnD,KAAKinD,QAAQh7C,KAAKjM,MACjCA,KAAKknD,SAAWlnD,KAAKknD,SAASj7C,KAAKjM,MAC9BiM,KAAAA,KAAK,QAASjM,KAAKinD,WACzB,CAAA/lD,IAAA,UAAAC,MAED,WACEnB,KAAKX,OAAOu1C,SAAW50C,KAAKX,OAAOu1C,YACpC,CAAA1zC,IAAA,WAAAC,MAED,WACEnB,KAAKX,OAAOu1C,SAAW50C,KAAKX,OAAOu1C,YACpC,CAAA1zC,IAAA,UAAAC,MAED,WACEnB,KAAKshC,OAAO,CAAC,QAAS,YAAathC,KAAKinD,WACzC,CAAA/lD,IAAA,SAAAC,MAED,WACE,IAAMm0B,EAAU,aAChB,MAAA,4HAAAl1B,OAE0EJ,KAAKgwB,SAASsF,GAAQl1B,MAAAA,OAAKJ,KAAKoV,KAAKkgB,GAAQ,sCAExH,CAAA,CAAAp0B,IAAA,aAAAK,IAnCD,WACS,MAAA,mBACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,QAEV4lD,GAV0BhzB,ICA7B,SAASmzB,GAAchmD,GACfimD,IAAAA,EAAMl6C,WAAW/L,GAGvB,OAD6C,IAA7BA,EAAMrC,QAAQ,OAAgBw3B,OAAOptB,MAAMk+C,IACzCA,EAGpB,IAAMC,GAAe,CACnB,cACA,eACA,aACA,gBACA,aACA,cACA,YACA,eACA,kBACA,mBACA,iBACA,qBAGIC,GAAqBD,GAAaznD,OA4BxC,SAAS2nD,GAASC,GAOZ,GALgB,iBAATA,IACFliD,EAAAA,SAAS0C,cAAcw/C,IAI3BA,GAAwB,WAAhBzlD,EAAOylD,IAAsBA,EAAKn8C,SAA3C,CAIE2B,IAAAA,EArBR,SAAmBw6C,GAOVx6C,OANOrO,OAAO2J,iBAAiBk/C,GAoBxBC,CAASD,GAGnBx6C,GAAkB,SAAlBA,EAAMsB,QACR,OAzCJ,WASE,IARA,IAAMo5C,EAAO,CACXh7C,MAAO,EACPC,OAAQ,EACRohC,WAAY,EACZC,YAAa,EACb2Z,WAAY,EACZC,YAAa,GAENjmD,EAAI,EAAGA,EAAI2lD,GAAoB3lD,IAEtC+lD,EADoBL,GAAa1lD,IACb,EAEf+lD,OAAAA,EA4BEG,GAGT,IAAMH,EAAO,GACbA,EAAKh7C,MAAQ86C,EAAKhY,YAClBkY,EAAK/6C,OAAS66C,EAAK/X,aAKnB,IAHA,IAAMqY,EAAcJ,EAAKI,YAAkC,eAApB96C,EAAM+6C,UAGpCpmD,EAAI,EAAGA,EAAI2lD,GAAoB3lD,IAAK,CAC3C,IAAMqmD,EAAcX,GAAa1lD,GAC3BR,EAAQ6L,EAAMg7C,GACdZ,EAAMl6C,WAAW/L,GAEvBumD,EAAKM,GAAgB1xB,OAAOptB,MAAMk+C,GAAa,EAANA,EAGrCa,IAAAA,EAAeP,EAAKQ,YAAcR,EAAKS,aACvCC,EAAgBV,EAAK7W,WAAa6W,EAAKW,cACvCC,EAAcZ,EAAKa,WAAab,EAAKc,YACrCC,EAAef,EAAKgB,UAAYhB,EAAKiB,aACrCC,EAAclB,EAAKmB,gBAAkBnB,EAAKoB,iBAC1CC,EAAerB,EAAKsB,eAAiBtB,EAAKuB,kBAE1CC,EAAuBpB,EAGvBqB,EAAahC,GAAan6C,EAAMN,QACnB,IAAfy8C,IACFzB,EAAKh7C,MAAQy8C,GAEVD,EAAuB,EAAIjB,EAAeW,IAGzCQ,IAAAA,EAAcjC,GAAan6C,EAAML,QAahC+6C,OAZa,IAAhB0B,IACF1B,EAAK/6C,OAASy8C,GAEXF,EAAuB,EAAId,EAAgBW,IAG3Chb,EAAAA,WAAa2Z,EAAKh7C,OAASu7C,EAAeW,GAC1C5a,EAAAA,YAAc0Z,EAAK/6C,QAAUy7C,EAAgBW,GAE7CpB,EAAAA,WAAaD,EAAKh7C,MAAQ47C,EAC1BV,EAAAA,YAAcF,EAAK/6C,OAAS87C,EAE1Bf,GAGA2B,SAAAA,GAAU5/C,EAAS6/C,GAC1B,IAAA,IAAS3nD,EAAI,EAAGA,EAAI8H,EAAQ7J,OAAQ+B,IAAK,CACvC,IAAM+H,EAAQD,EAAQ9H,GAClB+H,GAAAA,EAAM6/C,aAAeD,EAChB5/C,OAAAA,GAKb,IAAM8/C,GACG,YADHA,GAEE,WAFFA,GAGG,YAGHC,GAAoB,CACxBC,UAAW,CAAC,YAAa,WACzBC,WAAY,CAAC,YAAa,WAAY,eACtCC,YAAa,CAAC,cAAe,YAAa,kBAGvBC,YAAW7tC,GAAAC,EAAA4tC,EAAA7tC,GAAAE,IAAAA,EAAAC,EAAA0tC,GAC9B,SAAAA,EAAa72C,GAAoBoT,IAAAA,EAAdjkB,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAa3B,OAb6BqB,OAAA6oD,IAC7B3tC,EAAAA,EAAAzV,KAAAzG,OACK8pD,WAAY,EACjB1jC,EAAK2jC,YAAa,EAClB3jC,EAAKszB,QAAS,EACdtzB,EAAKuS,SAAW,GAChBvS,EAAK4jC,UAAY,GACjB5jC,EAAK6jC,UAAY,CAAEn5C,EAAG,EAAGC,EAAG,GAC5BqV,EAAK8jC,SAAW,CAAEp5C,EAAG,EAAGC,EAAG,GAE3BqV,EAAK8gB,MAAQl0B,aAAgBge,QAAUhe,EAAO1N,SAAS0C,cAAcgL,GAEhEm3C,EAAAA,YAAchoD,EAAQ2kC,kBAAkB9V,QAAU7uB,EAAQ2kC,OAASxhC,SAAS0C,cAAc7F,EAAQ2kC,QAClG1gB,EAAK8gB,OAAU9gB,EAAK+jC,aAiBzB/jC,EAAKgkC,kBAAiBhkC,GAhBpB4f,EAAA5f,GA2SHyjC,OA1RA5oD,EAAA4oD,EAAA,CAAA,CAAA3oD,IAAA,kBAAAC,MAED,WAAmB,IAAAumB,EAAA1nB,KACb,iBAAkBrB,OACpBqB,KAAKqqD,UAAY,aAEjBrqD,KAAKqqD,UAAY,YAEnBrqD,KAAI,KAAAI,OAAMJ,KAAKqqD,YAAerqD,KAAI,KAAAI,OAAMJ,KAAKqqD,YAAap+C,KAAKjM,MAC1DmqD,KAAAA,YAAYjiC,iBAAiBloB,KAAKqqD,UAAWrqD,UAAII,OAAMJ,KAAKqqD,aACjEZ,GAAkBzpD,KAAKqqD,WAAWziD,KAAI,SAAA1G,UAChCd,OAAMc,IAASwmB,EAAI,KAAAtnB,OAAMc,IAAO+K,KAAKyb,QAE5C,CAAAxmB,IAAA,oBAAAC,MAED,WACOgpD,KAAAA,YAAY/hC,oBAAoBpoB,KAAKqqD,UAAWrqD,UAAII,OAAMJ,KAAKqqD,eACrE,CAAAnpD,IAAA,uBAAAC,MAED,SAAsBqI,GAAO,IAAAme,EAAA3nB,KAC3B,GAAKwJ,EAAL,CAGMgR,IAAAA,EAASivC,GAAkBzpD,KAAKqqD,WAE/BziD,EAAAA,KAAI,SAAAiE,GACTlN,OAAOupB,iBAAiBrc,EAAW8b,EAAI,KAAAvnB,OAAMyL,QAG/C7L,KAAKsqD,oBAAsB9vC,KAC5B,CAAAtZ,IAAA,yBAAAC,MAED,WAA0B,IAAAymB,EAAA5nB,KACnBA,KAAKsqD,sBAGLA,KAAAA,oBAAoB1iD,KAAI,SAAAiE,GAE3BlN,OAAOypB,oBAAoBvc,EAAW+b,EAAI,KAAAxnB,OAAMyL,eAG3C7L,KAAKsqD,uBACb,CAAAppD,IAAA,SAAAC,MAED,WACEnB,KAAK8pD,WAAY,IAClB,CAAA5oD,IAAA,UAAAC,MAED,WACEnB,KAAK8pD,WAAY,EACb9pD,KAAK+pD,YACP/pD,KAAKuqD,SAER,CAAArpD,IAAA,UAAAC,MAED,SAASwF,GACP3G,KAAKuqD,SACN,CAAArpD,IAAA,UAAAC,MAED,WAAW,IAAAgnB,EAAAnoB,KAEJA,KAAK+pD,aAIV/pD,KAAKwqD,eAEL7rD,OAAOoE,uBAAsB,WAC3BolB,EAAK4rB,gBAER,CAAA7yC,IAAA,eAAAC,MAED,WAGE,IAAM4uC,EAAS3vC,eAAAA,OAAkBJ,KAAKiqD,UAAUn5C,EAAC,QAAA1Q,OAAOJ,KAAKiqD,UAAUl5C,EAAS,UAC3Em2B,KAAAA,MAAMl6B,MAAM+iC,UAAYA,EACxB7I,KAAAA,MAAMl6B,MAAMy9C,gBAAkB1a,IACpC,CAAA7uC,IAAA,aAAAC,MAED,WACEnB,KAAKknC,MAAMl6B,MAAM6zB,KAAO7gC,KAAK24B,SAAS7nB,EAAI,KAC1C9Q,KAAKknC,MAAMl6B,MAAMw2B,IAAMxjC,KAAK24B,SAAS5nB,EAAI,OAC1C,CAAA7P,IAAA,cAAAC,MAED,SAAawF,GACN+jD,KAAAA,UAAU/jD,EAAGA,KACnB,CAAAzF,IAAA,cAAAC,MAED,SAAawF,GACNgkD,KAAAA,SAAShkD,EAAGA,KAClB,CAAAzF,IAAA,YAAAC,MAED,SAAWwF,GACJikD,KAAAA,QAAQjkD,EAAGA,KACjB,CAAAzF,IAAA,eAAAC,MAED,SAAcwF,GACN+C,IAAAA,EAAQ/C,EAAEgD,eAAe,GAC1B+gD,KAAAA,UAAU/jD,EAAG+C,GAClB1J,KAAK6qD,qBAAsCxnD,IAApBqG,EAAMohD,UACzBphD,EAAMohD,UACNphD,EAAM6/C,WACV5iD,EAAEutC,mBACH,CAAAhzC,IAAA,cAAAC,MAED,SAAawF,GACX,IAAM+C,EAAQ2/C,GAAS1iD,EAAEgD,eAAgB3J,KAAK6qD,iBAC1CnhD,GACGihD,KAAAA,SAAShkD,EAAG+C,KAEpB,CAAAxI,IAAA,aAAAC,MAED,SAAYwF,GACV,IAAM+C,EAAQ2/C,GAAS1iD,EAAEgD,eAAgB3J,KAAK6qD,iBAC1CnhD,GACGkhD,KAAAA,QAAQjkD,EAAG+C,GAElB/C,EAAEutC,mBACH,CAAAhzC,IAAA,gBAAAC,MAED,SAAewF,GACb,IAAM+C,EAAQ2/C,GAAS1iD,EAAEgD,eAAgB3J,KAAK6qD,iBAC1CnhD,GACGqhD,KAAAA,WAAWpkD,EAAG+C,KAEtB,CAAAxI,IAAA,YAAAC,MAED,SAAWwF,EAAGqkD,GACZ,GAAKhrD,KAAKknC,QAASlnC,KAAK05C,QAAW15C,KAAK8pD,UAAxC,CAGA9pD,KAAKgqD,UAAYgB,EACjBhrD,KAAKiqD,UAAUn5C,EAAI,EACnB9Q,KAAKiqD,UAAUl5C,EAAI,EAEnB/Q,KAAKirD,eAECvD,IAAAA,EAAOH,GAAQvnD,KAAKknC,OAErBgjB,KAAAA,SAASp5C,EAAI9Q,KAAK24B,SAAS7nB,EAC3Bo5C,KAAAA,SAASn5C,EAAI/Q,KAAK24B,SAAS5nB,EAChC/Q,KAAKkqD,SAASgB,KAAOvsD,OAAOqvC,YAAc0Z,EAAK/6C,OAC/C3M,KAAKkqD,SAASiB,KAAOxsD,OAAOovC,WAAa2Z,EAAKh7C,MAC9C1M,KAAKorD,aAELprD,KAAK05C,QAAS,EACd15C,KAAKqrD,qBAAqB1kD,MAC3B,CAAAzF,IAAA,gBAAAC,MAED,SAAewF,EAAGqkD,GAChBhrD,KAAK+pD,YAAa,EAClB/pD,KAAK+zC,UACL/zC,KAAK+a,KAAKyuC,GAAcxpD,KAAKkqD,YAC9B,CAAAhpD,IAAA,UAAAC,MAED,SAASwF,EAAGqkD,GACLhrD,KAAKknC,QAGVlnC,KAAKsrD,yBACDtrD,KAAK+pD,aACF7iB,KAAAA,MAAMl6B,MAAM+iC,UAAY,GAC7B/vC,KAAKorD,aACArwC,KAAAA,KAAKyuC,KAEZxpD,KAAKurD,gBACN,CAAArqD,IAAA,mBAAAC,MAED,SAAkBwF,EAAGqkD,GACnB,IAAMQ,EAAa,CACjB16C,EAAGk6C,EAAQjhD,MAAQ/J,KAAKgqD,UAAUjgD,MAClCgH,EAAGi6C,EAAQ7gD,MAAQnK,KAAKgqD,UAAU7/C,OAM7BqhD,OAHFxrD,KAAK+pD,YAAc/pD,KAAKyrD,eAAeD,IACrCE,KAAAA,cAAc/kD,EAAGqkD,GAEjBQ,IACR,CAAAtqD,IAAA,WAAAC,MAED,SAAUwF,EAAGqkD,GAEP,GADJrkD,EAAIA,GAAKhI,OAAO6K,MACXxJ,KAAK05C,OAAN,CAGJ,IAAAiS,EAAiB3rD,KAAKkqD,SAAdp5C,EAAC66C,EAAD76C,EAAGC,EAAC46C,EAAD56C,EACLy6C,EAAaxrD,KAAK4rD,iBAAiBjlD,EAAGqkD,GACxCa,EAAQL,EAAW16C,EACnBg7C,EAAQN,EAAWz6C,EACvB86C,EAAQ7rD,KAAK+rD,aAAa,IAAKF,EAAO/6C,GACtCg7C,EAAQ9rD,KAAK+rD,aAAa,IAAKD,EAAO/6C,GACjC4nB,KAAAA,SAAS7nB,EAAIA,EAAI+6C,EACjBlzB,KAAAA,SAAS5nB,EAAIA,EAAI+6C,EACtB9rD,KAAKiqD,UAAUn5C,EAAI+6C,EACnB7rD,KAAKiqD,UAAUl5C,EAAI+6C,EACnB9rD,KAAK+a,KAAKyuC,GAAaxpD,KAAK24B,aAC7B,CAAAz3B,IAAA,aAAAC,MAED,SAAYwF,EAAGqkD,GACRJ,KAAAA,QAAQjkD,EAAGqkD,KACjB,CAAA9pD,IAAA,aAAAC,MAED,WACEnB,KAAK+pD,YAAa,EAClB/pD,KAAKkqD,SAAW,CACdp5C,EAAG,EACHC,EAAG,GAEL/Q,KAAKiqD,UAAY,CACfn5C,EAAG,EACHC,EAAG,GAEL/Q,KAAK05C,QAAS,IACf,CAAAx4C,IAAA,UAAAC,MAED,WACEnB,KAAKgsD,oBACLhsD,KAAKsrD,yBACDtrD,KAAK+pD,YACP/pD,KAAK4qD,UAEP5qD,KAAKwb,qBACLxb,KAAKmqD,YAAc,OACpB,CAAAjpD,IAAA,iBAAAC,MAED,SAAgBqqD,GACPrnD,OAAAA,KAAK0P,IAAI23C,EAAW16C,GAAK,GAAK3M,KAAK0P,IAAI23C,EAAWz6C,GAAK,IAC/D,CAAA7P,IAAA,eAAAC,MAED,SAAc8qD,EAAM/K,EAAMgL,GACpBhL,OAAAA,EAAOgL,EAAO,EACT,EAAIA,EAGA,MAATD,GAAgB/K,EAAOgL,EAAOlsD,KAAKkqD,SAASiB,KACvCnrD,KAAKkqD,SAASiB,KAAOe,EAEjB,MAATD,GAAgB/K,EAAOgL,EAAOlsD,KAAKkqD,SAASgB,KACvClrD,KAAKkqD,SAASgB,KAAOgB,EAEvBhL,IACR,CAAAhgD,IAAA,eAAAC,MAED,WACE,IAAM6L,EAAQrO,OAAO2J,iBAAiBtI,KAAKknC,OACrCp2B,EAAI9Q,KAAKmsD,kBAAkBn/C,EAAM6zB,KAAM,SACvC9vB,EAAI/Q,KAAKmsD,kBAAkBn/C,EAAMw2B,IAAK,UAE5CxjC,KAAK24B,SAAS7nB,EAAIwlB,OAAOptB,MAAM4H,GAAK,EAAIA,EACxC9Q,KAAK24B,SAAS5nB,EAAIulB,OAAOptB,MAAM6H,GAAK,EAAIA,EAExC/Q,KAAKosD,sBAAsBp/C,KAC5B,CAAA9L,IAAA,wBAAAC,MAED,SAAuB6L,GACrB,IAAM+iC,EAAY/iC,EAAM+iC,UAExB,GAAoC,IAAhCA,EAAUjxC,QAAQ,UAAtB,CAIMutD,IAAAA,EAAetc,EAAU9oC,MAAM,KAE/BqlD,EAA2C,IAAlCvc,EAAUjxC,QAAQ,YAAoB,GAAK,EACpDytD,EAAa1+C,SAASw+C,EAAaC,GAAS,IAE5CE,EAAa3+C,SAASw+C,EAAaC,EAAS,GAAI,IACtDtsD,KAAK24B,SAAS7nB,GAAKy7C,EACnBvsD,KAAK24B,SAAS5nB,GAAKy7C,KACpB,CAAAtrD,IAAA,oBAAAC,MAED,SAAmBsrD,EAAWC,GAC5B,IAAmC,IAA/BD,EAAU3tD,QAAQ,KAAa,CAEjC,IAAM6tD,EAAapF,GAAQvnD,KAAKknC,MAAMvV,YAEtC,OAAQg7B,EAEHz/C,WAAWu/C,GAAa,IAAOE,EAAWD,GAD3C,EAGC7+C,OAAAA,SAAS4+C,EAAW,QAC5B5C,GA1TsC1vC,ICpHnCyyC,YAAUrsB,GAAAtkB,EAAA2wC,EAAArsB,GAAArkB,IAAAA,EAAAC,EAAAywC,GAuBd,SAAAA,EAAazpD,GAAMijB,IAAAA,EAAAplB,OAAA4rD,GACN3kC,EAAAuY,EAAXtkB,EAAAA,EAAAzV,UAAMtD,IAuEQ,iBAAA,SAACwD,GAGfyf,EAAK8gC,WACL9gC,EAAKymC,SAAU,KAChB5kC,EAAAuY,EAAApa,GAEe,iBAAA,SAACzf,GACf,IAAQgO,EAAR6rB,EAAApa,GAAQzR,OACRA,EAAO0Q,OAAS1Q,EAAO+U,OAAS/U,EAAO4U,WACxCtB,EAAAuY,EAAApa,GAEU,YAAA,SAACzf,GACV,MAAMhI,OAAOmuD,SAA8B,IAAnBnuD,OAAOmuD,SAAkB3oD,KAAK0P,IAAIlV,OAAOmuD,QAAU1mC,EAAKjT,IAAI25C,SAAW,IAA/F,CAGIC,IAAAA,EAAel/C,SAASiI,EAAK3N,OAAOie,EAAKzR,OAAO3B,KAAM,WAC1D+5C,GAAgB3mC,EAAK/mB,OAAOsQ,UACvBwD,EAAAA,IAAI25C,QAAUnuD,OAAOmuD,QACtBnuD,OAAOmuD,QAAUC,EAAe,GACjC3mC,EAAK6a,SAAW7a,EAAKymC,SAAWzmC,EAAK6gC,UAC7BtoD,OAAOmuD,SAAWC,IACtB9rB,EAAAA,QAAU7a,EAAK8gC,WACpB9gC,EAAKymC,SAAU,OA7FjBzmC,EAAK6a,QAAS,EACd7a,EAAKymC,SAAU,EACf,IAAQxtD,EAARmhC,EAAApa,GAAQ/mB,OAQa+mB,OAPrBA,EAAKjT,IAAM,CACT0tB,KAAMxhC,EAAOwhC,KAAO,EAAIliC,OAAOovC,WAAa1uC,EAAOqN,MAAQ,GAAKrN,EAAOwhC,KACvE2C,IAAKnkC,EAAOmkC,IAAM,EAAI7kC,OAAOqvC,YAAc3uC,EAAOsN,OAAS,GAAKtN,EAAOmkC,IACvE72B,OAAQyZ,EAAK/mB,OAAOsN,OACpBD,MAAO0Z,EAAK/mB,OAAOqN,MACnBogD,QAASnuD,OAAOmuD,SAAW,GAE7B1mC,EAAK4mC,UAAY,KAAI5mC,EAdtBwmC,OAeA3rD,EAAA2rD,EAAA,CAAA,CAAA1rD,IAAA,eAAAC,MAED,SAAcgC,GAC2B,kBAA5BA,EAAKwR,OAAOtV,OAAO+/B,OAC5Bj8B,EAAK9D,OAAO4tD,WAAa9pD,EAAKwR,OAAOtV,OAAO+/B,QAE/C,CAAAl+B,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACbA,KAAK6zC,YACAt4B,KAAAA,GAAG9B,GAAc,WACfub,EAAAA,QAAQ,aAAc,YAExBzZ,KAAAA,GAAG9B,GAAa,WACdub,EAAAA,QAAQ,aAAc,aAE9B,CAAA9zB,IAAA,iBAAAC,MAED,WAAkB,IAAAwmB,EAAA3nB,KACR2U,EAAmB3U,KAAnB2U,OACR,IAD2B3U,KAAXX,OACLm2B,QAAX,CAGI,GAAAx1B,KAAKX,OAAO4tD,WAAY,CAC1B,IAAM9qD,EAAU,CACd9C,OAAQ,CACNu1C,QAAS,WACPjtB,EAAKs/B,aAIXtyC,EAAO6R,SAASiK,eAAeu2B,GAAgB7kD,EAAS6kD,GAAel5B,YAEzE,IAAMjiB,EAAYiK,EAAK7F,oBAAsB,WAAa,QAC1DjQ,KAAKiM,KAAK,mBAAoBJ,EAAW7L,KAAKktD,eAC9CltD,KAAKiM,KAAK,aAAcJ,EAAW7L,KAAKmtD,eACnCntD,KAAKX,OAAO+tD,cACfptD,KAAKqtD,aAAe,IAAIxD,GAAY7pD,KAAK2U,OAAO3B,KAAM,CACpD8zB,OAAQ9mC,KAAKgT,QAGbhT,KAAKX,OAAOiuD,gBACPplC,OAAAA,iBAAiB,SAAUloB,KAAKutD,aAE1C,CAAArsD,IAAA,gBAAAC,MAED,WACS,MAAA,CACLuoB,KAAM,CAAE0J,KAAMo6B,GAAU35B,MAAO,gBAC/BtK,MAAO,CAAE6J,KAAMq6B,GAAW55B,MAAO,oBAEpC,CAAA3yB,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,aAAc0gB,EAAMjK,MAChCzW,KAAAA,YAAY,aAAc0gB,EAAMpK,SACtC,CAAAroB,IAAA,UAAAC,MA6BD,WAAW,IAAAymB,EAAA5nB,KACT,IAAIA,KAAKihC,OAAT,CAGA,IAAQtsB,EAAyB3U,KAAzB2U,OAAQib,EAAiB5vB,KAAjB4vB,aACV5lB,EAAShK,KAAKX,OAAO2K,QAAUhK,KAAK2U,OAAO3B,KACjDhT,KAAKgtD,UAAY,GACZ5mD,EAAAA,SAASuO,EAAO3B,KAAM,iBAC3B,CAAC,QAAS,SAAU,MAAO,QAAQpL,KAAI,SAAA1G,GAChC8rD,EAAAA,UAAU9rD,GAAO8I,EAAOgD,MAAM9L,GACnC8I,EAAOgD,MAAM9L,GAAId,GAAAA,OAAMwnB,EAAKzU,IAAIjS,GAAQ,SAEtC0uB,EAAaqN,QACfjzB,EAAOgD,MAAM,eAAiB,IAE3B+N,KAAAA,KAAKtB,IAA0B,GAC7BwnB,EAAAA,OAASjhC,KAAKihC,QAAS,KAC/B,CAAA//B,IAAA,WAAAC,MAED,WAAY,IAAAgnB,EAAAnoB,KACN,IAACA,KAAKihC,OACD,OAAA,EAET,IAAQtsB,EAAyB3U,KAAzB2U,OAAQib,EAAiB5vB,KAAjB4vB,aACV5lB,EAAShK,KAAKX,OAAO2K,QAAUhK,KAAK2U,OAAO3B,KAC5C7L,EAAAA,YAAYwN,EAAO3B,KAAM,iBAC1BhT,KAAKgtD,WACPtnD,OAAOC,KAAK3F,KAAKgtD,WAAWplD,KAAI,SAAA1G,GACvB8L,EAAAA,MAAM9L,GAAOinB,EAAK6kC,UAAU9rD,MAGvClB,KAAKgtD,UAAY,KACbp9B,EAAaqN,QACRjqB,EAAAA,KAAKhG,MAAMN,MAAQ,OACnBsG,EAAAA,KAAKhG,MAAML,OAAS,IACpBqG,EAAAA,KAAKhG,MAAM,eAAc5M,GAAAA,OAA4B,IAAtBwvB,EAAajjB,OAAeijB,EAAaljB,MAAQ,MAEpFqO,KAAAA,KAAKtB,IAA0B,GAC/BwnB,KAAAA,OAAStsB,EAAOssB,QAAS,IAC/B,CAAA//B,IAAA,YAAAC,MAGD,SAAWgS,GACTnT,KAAKmT,IAAMzN,OAAO6gB,OAAOvmB,KAAKmT,IAAKA,GAC/BnT,KAAKihC,SACFtsB,KAAAA,OAAO3B,KAAKhG,MAAM6zB,KAAIzgC,GAAAA,OAAMJ,KAAKmT,IAAI0tB,KAAQ,MAC7ClsB,KAAAA,OAAO3B,KAAKhG,MAAMw2B,IAAGpjC,GAAAA,OAAMJ,KAAKmT,IAAIqwB,IAAO,MAC3C7uB,KAAAA,OAAO3B,KAAKhG,MAAMN,MAAKtM,GAAAA,OAAMJ,KAAKmT,IAAIzG,MAAS,MAC/CiI,KAAAA,OAAO3B,KAAKhG,MAAML,OAAMvM,GAAAA,OAAMJ,KAAKmT,IAAIxG,OAAU,SAEzD,CAAAzL,IAAA,UAAAC,MAED,WACSinB,OAAAA,oBAAoB,SAAUpoB,KAAKutD,UAC1C,IAAM1hD,EAAYiK,EAAK7F,oBAAsB,WAAa,QAC1DjQ,KAAKshC,OAAO,mBAAoBz1B,EAAW7L,KAAKktD,eAChDltD,KAAKshC,OAAO,aAAcz1B,EAAW7L,KAAKmtD,eACrCE,KAAAA,cAAgBrtD,KAAKqtD,aAAaz8B,UACvC5wB,KAAKqtD,aAAe,KACpBrtD,KAAKknD,aACN,CAAAhmD,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,6GAAAp1B,OAGI+xB,GAAWnyB,KAAM,YAAaA,KAAK4vB,aAAagQ,YAAW,uiBAUhE,CAAA,CAAA1+B,IAAA,aAAAK,IAxMD,WACS,MAAA,eAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLH,MAAO,GACPo0B,SAAS,EACT9oB,MAAO,IACPC,OAAQ,IACRk0B,MAAM,EACN2C,KAAK,EACLypB,YAAY,EACZK,gBAAgB,EAChB39C,UAAW,EACXy9C,aAAa,OAEhBR,GArBsB54B,IClBnB05B,GAAe,CACnBC,WAAY,eACZC,WAAY,eACZC,UAAW,eAGPC,GAAQ,CAAC,aAAc,gBAERC,YAAQ95B,GAAAhY,EAAA8xC,EAAA95B,GAAA/X,IAAAA,EAAAC,EAAA4xC,GAAA,SAAAA,IAAA3nC,IAAAA,EAAAplB,OAAA+sD,GAAA,IAAA,IAAAruD,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GA4K1BqmB,OAtHD6B,EAAAuY,EAtD2BtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAyDb,eAAA,SAACwD,GACTyf,GAAAA,EAAK4nC,uBACPrnD,MAAAA,GAAAA,EAAGsnD,+BADD7nC,CAKJqa,IAAAA,EAAAD,EAAApa,GAAQzR,EAAM8rB,EAAN9rB,OAAQib,EAAY6Q,EAAZ7Q,aACXjb,EAAO+H,WACV/H,EAAO+rB,MAAM,CAAEC,UAAW/Q,EAAakO,kBACtClO,EAAasO,sBAAwBvpB,EAAO9C,MAAM6uB,aAIvDzY,EAAAuY,EAAApa,GAGe,gBAAA,SAACzf,GACVyf,GAAAA,EAAK4nC,uBACPrnD,MAAAA,GAAAA,EAAGsnD,+BADD7nC,CAKJ8nC,IAAAA,EAAA1tB,EAAApa,GAAQwJ,EAAYs+B,EAAZt+B,aAAcjb,EAAMu5C,EAANv5C,QACrBib,EAAasO,sBAAwBvpB,EAAO9C,MAAM6uB,QAC/C9Q,EAAakO,eACfnpB,EAAO+rB,MAAM,CAAEC,UAAU,IAEzBhsB,EAAO+rB,QAETta,EAAKrL,KAAKjD,QAGZmQ,EAAAuY,EAAApa,GAGe,gBAAA,SAACzf,GACVyf,GAAAA,EAAK4nC,uBACPrnD,MAAAA,GAAAA,EAAGsnD,+BADD7nC,CAKJm6B,IAAAA,EAA6Dn6B,EAAKwJ,aAA1DiO,EAAe0iB,EAAf1iB,gBAAiBE,EAAewiB,EAAfxiB,gBAAiBD,EAAcyiB,EAAdziB,eACrCD,GAAoBC,IACnBC,EACF3X,EAAKzR,OAAO+rB,MAAM,CAAEC,UAAU,EAAMuN,MAAOnQ,IAE3C3X,EAAKzR,OAAOysB,KAAK,CAACC,cAAc,KAGpCjb,EAAKrL,KAAKlD,QACXoQ,EAAAuY,EAAApa,GAec,gBAAA,SAACzf,GACd6yC,IAAAA,EAAAhZ,EAAApa,GAAQzR,EAAM6kC,EAAN7kC,OAAQib,EAAY4pB,EAAZ5pB,aACZjpB,EAAEqD,QAAU4lB,EAAa+N,iBAGzBh3B,EAAEqD,SAAW2K,EAAO3B,MAAQrM,EAAEqD,SAAW2K,EAAO9C,OAASlL,EAAEqD,SAAW2K,EAAO2wB,gBAAkB3+B,EAAEqD,SAAW2K,EAAO9C,MAAMs8C,WAC3HxnD,EAAEutC,iBACGtkB,EAAaw+B,2BAChBznD,EAAE+I,kBAEC2+C,EAAAA,cACDjoC,EAAKkoC,aACP3pD,aAAayhB,EAAKkoC,YAClBloC,EAAKkoC,WAAa,MAEfA,EAAAA,WAAa7qD,YAAW,WACtB2iB,EAAKioC,cAGLA,EAAAA,cACLrgC,GAAQwS,EAAApa,GAAO0nC,GAAM,IAAI,SAACn/B,EAAQ/D,GAC3B2jC,EAAAA,gBAAgB3jC,EAAKjkB,KACzB,CAAEA,EAAAA,EAAG0e,OAAQ1Q,EAAO0Q,SACvB1gB,aAAayhB,EAAKkoC,YAClBloC,EAAKkoC,WAAa,QACjB,SAENrmC,EAAAuY,EAAApa,GAEiB,mBAAA,SAACzf,GACjBizC,IAAAA,EAAApZ,EAAApa,GAAQzR,EAAMilC,EAANjlC,OAAQib,EAAYgqB,EAAZhqB,aACZA,EAAagO,qBAAuBj3B,EAAEqD,QAAWrD,EAAEqD,SAAW2K,EAAO9C,OAASlL,EAAEqD,SAAW2K,EAAO9C,MAAMs8C,YAGvGv+B,EAAa+N,iBAAmBvX,EAAKioC,YAAc,EACtDjoC,EAAKioC,YAAc,GAGrBjoC,EAAKioC,YAAc,EACfjoC,EAAKkoC,aACP3pD,aAAayhB,EAAKkoC,YAClBloC,EAAKkoC,WAAa,MAEpB3nD,EAAEutC,iBACFvtC,EAAE+I,kBAEFse,GAAQwS,EAAApa,GAAO0nC,GAAM,IAAI,SAACn/B,EAAQ/D,GAC3B4F,EAAAA,eAAe5F,EAAKjkB,EAAG,oBAAqB,CAAE87B,MAAO,aAAcE,KAAMhuB,EAAOsuB,WAAYL,IAAKjuB,EAAOsuB,aAC7GtuB,EAAOsuB,WAAatuB,EAAOw3B,iBAAmBx3B,EAAOsgC,kBACpD,CAAEtuC,EAAAA,EAAGs8B,WAAYtuB,EAAOsuB,kBAC5B7c,EApKA2nC,OAoKA9sD,EAAA8sD,EAAA,CAAA,CAAA7sD,IAAA,cAAAC,MAlKD,WAAe,IAAAumB,EAAA1nB,KACbA,KAAKquD,YAAc,EACbzmD,GAAAA,KAAI,SAAA/B,GACR6hB,EAAKkG,QAAQ/nB,GAAQ,QAGM,WADI7F,KAAK4vB,aAA9B2N,sBACqD,WAAnBpW,GAAQhG,SAAwBgG,GAAQ/F,GAAGoB,QAGrFxiB,KAAKwuD,eACN,CAAAttD,IAAA,aAAAC,MAED,WAAc,IAAAwmB,EAAA3nB,KACZkwB,EAAwBlwB,KAAK2U,OAArB9C,EAAKqe,EAALre,MAAOmB,EAAIkd,EAAJld,KACP0qB,EAAsB19B,KAAK4vB,aAA3B8N,kBAER1qB,GAAQA,EAAKkV,iBAAiB,QAASloB,KAAKyuD,cAAc,GAC1Dz7C,GAAQA,EAAKkV,iBAAiB,WAAYloB,KAAK0uD,iBAAiB,GAChEhpD,OAAOC,KAAK+nD,IAAc9lD,KAAI,SAAA/B,GAC5BmN,EAAKkV,iBAAiBriB,EAAM8hB,EAAK+lC,GAAa7nD,KAAQ,OAEvD63B,GAAqB7rB,GAASA,EAAMqW,iBAAiB,cAAeloB,KAAK2uD,eAAe,KAG3F,CAAAztD,IAAA,uBAAAC,MAKA,WAAuB,IAAAq9C,EAAAoQ,EACfC,UAAYrQ,EAAGx+C,KAAK2U,cAAM,IAAA6pC,GAAS,QAAToQ,EAAXpQ,EAAa9vB,eAAbkgC,IAAoBA,OAAT,EAAXA,EAAsBE,OAC3C,QAASD,IAAgD,IAAhCA,EAAaE,iBACvC,CAAA7tD,IAAA,kBAAAC,MAED,SAAiBwF,GACf,IAAQgO,EAAW3U,KAAX2U,OACH6b,KAAAA,eAAe7pB,EAAG,oBAAqB,CAAE87B,MAAO,SAAUE,KAAMhuB,EAAO0Q,OAAQud,IAAKjuB,EAAO0Q,SAC3F1Q,EAAOU,MAGVV,EAAO9B,WAAaoX,EAAAA,GAAYtV,EAAO9B,SAAW,GAAK8B,EAAOyhC,SAF9DzhC,EAAO0Q,OAAS1Q,EAAO+U,OAAS/U,EAAO4U,UAI1C,CAAAroB,IAAA,gBAAAC,MAyDD,SAAewF,IACbA,EAAIA,GAAKhI,OAAO6K,OACV0qC,gBACJvtC,EAAEutC,iBAEAvtC,EAAE+I,gBACJ/I,EAAE+I,mBAEF/I,EAAEqoD,aAAc,EAChBroD,EAAEsoD,cAAe,KAEpB,CAAA/tD,IAAA,UAAAC,MAsDD,WAAW,IAAAymB,EAAA5nB,KACTkvD,EAAwBlvD,KAAK2U,OAArB/C,EAAKs9C,EAALt9C,MAAOoB,EAAIk8C,EAAJl8C,KACVs7C,KAAAA,YAAc3pD,aAAa3E,KAAKsuD,YACrCt7C,EAAKoV,oBAAoB,QAASpoB,KAAKyuD,cAAc,GACrDz7C,EAAKoV,oBAAoB,WAAYpoB,KAAK0uD,iBAAiB,GAC3D98C,EAAMwW,oBAAoB,cAAepoB,KAAK2uD,eAAe,GAC7DjpD,OAAOC,KAAK+nD,IAAc9lD,KAAI,SAAA/B,GAC5BmN,EAAKoV,oBAAoBviB,EAAM+hB,EAAK8lC,GAAa7nD,KAAQ,SAE5D,CAAA,CAAA3E,IAAA,aAAAK,IAtLD,WACS,MAAA,OACR,CAAAL,IAAA,gBAAAK,IAED,WACE,MAAO,OAERwsD,GARmCx+B,ICZhCi6B,GACG,QADHA,GAEO,WAFPA,GAGU,cAHVA,GAIG,QAJHA,GAKQ,YALRA,GAMS,aANTA,GAOO,WAGP2F,GAAS,CACb9tD,MAAO,aACPC,IAAK,WACL8tD,KAAM,YACN3qD,OAAQ,eAGJ4qD,GAAS,CACbhuD,MAAO,YACPC,IAAK,UACL8tD,KAAM,YACN3qD,OAAQ,cAGV,SAAS4kD,GAAU5/C,GACbA,OAAAA,GAAWA,EAAQ7J,OAAS,EACvB6J,EAAQA,EAAQ7J,OAAS,GAEzB,KAaV,IAEK0vD,GAAM,WACV,SAAAA,EAAajqD,GAAsC,IAAA+gB,EAAApmB,KAAjCX,EAAMM,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEg2B,UAAW,SAAS30B,OAAAsuD,GAAArnC,EAAAjoB,KAAA,gBAuGlC,SAAC2G,GACd,IAAQ4oC,EAAenpB,EAAfmpB,KAAMv8B,EAASoT,EAATpT,KAERtJ,EAAQ2/C,GAAS1iD,EAAE8C,SACzB8lC,EAAKz+B,EAAIpH,EAAQmE,SAASnE,EAAMK,MAAO,IAAMpD,EAAEoD,MAC/CwlC,EAAKx+B,EAAIrH,EAAQmE,SAASnE,EAAMK,MAAO,IAAMpD,EAAEoD,MAC/CwlC,EAAKluC,OAAQ,EACb+kB,EAAKmpC,WAAW5oD,GAChBqM,EAAKkV,iBAAiB9B,EAAK5L,OAAOlZ,IAAK8kB,EAAKopC,YAC5Cx8C,EAAKkV,iBAAiB9B,EAAK5L,OAAO/V,OAAQ2hB,EAAKqpC,eAC/Cz8C,EAAKkV,iBAAiB9B,EAAK5L,OAAO40C,KAAMhpC,EAAKspC,aACxCC,EAAAA,QAAQnG,GAAoB7iD,MAClCshB,EAAAjoB,KAAA,iBAEe,SAAC2G,GACfyf,EAAKopC,WAAW7oD,MACjBshB,EAAAjoB,KAAA,cAEY,SAAC2G,GACZ,IAAQ4oC,EAAenpB,EAAfmpB,KAAMv8B,EAASoT,EAATpT,KACdoT,EAAKwpC,eACL58C,EAAKoV,oBAAoBhC,EAAK5L,OAAO/V,OAAQ2hB,EAAKqpC,eAClDz8C,EAAKoV,oBAAoBhC,EAAK5L,OAAOlZ,IAAK8kB,EAAKopC,YAC/Cx8C,EAAKoV,oBAAoBhC,EAAK5L,OAAO40C,KAAMhpC,EAAKspC,aAChD/oD,EAAEqyC,OAASzJ,EAAKyJ,OAChBryC,EAAEkpD,MAAQtgB,EAAKsgB,MACftgB,EAAKsgB,OAASzpC,EAAKupC,QAAQnG,GAAkB7iD,GACxCgpD,EAAAA,QAAQnG,GAAkB7iD,IAC9B4oC,EAAKsgB,QAAUtgB,EAAKyJ,QAAU5yB,EAAK0pC,QAAQnpD,GAC5C4oC,EAAKsgB,OAAQ,EACbtgB,EAAKluC,OAAQ,EACbkuC,EAAKyJ,QAAS,KACf/wB,EAAAjoB,KAAA,eAEa,SAAC2G,GACb,IAAQ4oC,EAAiBnpB,EAAjBmpB,KAAMlwC,EAAW+mB,EAAX/mB,OACRqK,EAAQ2/C,GAAS1iD,EAAE8C,SACnBqH,EAAIpH,EAAQmE,SAASnE,EAAMK,MAAO,IAAMpD,EAAEoD,MAC1CgH,EAAIrH,EAAQmE,SAASnE,EAAMS,MAAO,IAAMxD,EAAEoD,MAC1CgmD,EAAQj/C,EAAIy+B,EAAKz+B,EACjBk/C,EAAQj/C,EAAIw+B,EAAKx+B,EACnB5M,KAAK0P,IAAIm8C,GAAS3wD,EAAO4wD,UAAY9rD,KAAK0P,IAAIk8C,GAAS1wD,EAAO4wD,WAGlE7pC,EAAKwpC,eACLrgB,EAAKsgB,OAASzpC,EAAKupC,QAAQnG,GAAkB7iD,GAC7C4oC,EAAKsgB,OAAQ,EACbtgB,EAAKyJ,QAAS,EACT2W,EAAAA,QAAQnG,GAAmB7iD,OAtJhC3G,KAAKuvC,KAAO,CACVyJ,QAAQ,EACR33C,OAAO,EACPyP,EAAG,EACHC,EAAG,GAEL/Q,KAAKX,OAlBA,CACL6wD,WAAY,IACZC,aAAc,IACdC,cAAc,EACdC,gBAAgB,EAChBJ,SAAU,EACVK,oBAAoB,GAapB5qD,OAAOC,KAAKtG,GAAQuI,KAAI,SAAA1G,GACjB7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,MAE5BlB,KAAKgT,KAAO3N,EACZrF,KAAKwa,OAA8B,UAArBnb,EAAOs2B,UAAwB05B,GAASF,GAItDnvD,KAAKuwD,eAAiB,KAItBvwD,KAAKwwD,YAAc,KACnBxwD,KAAKm3B,WAAa,GAClBn3B,KAAKywD,aA6INnB,OA5IAruD,EAAAquD,EAAA,CAAA,CAAApuD,IAAA,aAAAC,MAED,WACEnB,KAAKgT,KAAKkV,iBAAiBloB,KAAKwa,OAAOnZ,MAAOrB,KAAK0wD,gBACpD,CAAAxvD,IAAA,aAAAC,MAED,SAAYwF,GAAG,IAAA+gB,EAAA1nB,KACLX,EAAWW,KAAXX,OACJW,KAAKuwD,gBACPvwD,KAAK4vD,eAEFW,KAAAA,eAAiB9sD,YAAW,WAC1BksD,EAAAA,QAAQnG,GAAc7iD,GAC3B+gB,EAAK6nB,KAAKsgB,OAAQ,EAClBnoC,EAAKkoC,iBACJvwD,EAAO6wD,cACX,CAAAhvD,IAAA,eAAAC,MAED,WACSwD,OAAAA,aAAa3E,KAAKuwD,gBACzBvwD,KAAKuwD,eAAiB,OACvB,CAAArvD,IAAA,UAAAC,MAED,SAASwF,GAAG,IAAAghB,EAAA3nB,KACFX,EAAWW,KAAXX,OACR,GAAIW,KAAKwwD,YAGP,OAFAxwD,KAAK2wD,iBACAhB,KAAAA,QAAQnG,GAAqB7iD,GAG/B6pD,KAAAA,YAAc/sD,YAAW,WAC5BkkB,EAAKgpC,YACAhpC,EAAK4nB,KAAKluC,OAAUsmB,EAAK4nB,KAAKsgB,OAAUloC,EAAK4nB,KAAKyJ,QAChD2W,EAAAA,QAAQnG,GAAc7iD,KAE5BtH,EAAO8wD,gBACX,CAAAjvD,IAAA,YAAAC,MAED,WACEwD,aAAa3E,KAAKwwD,aAClBxwD,KAAKwwD,YAAc,OACpB,CAAAtvD,IAAA,KAAAC,MAED,SAAIqI,EAAO6jB,GACJrtB,KAAKm3B,WAAW3tB,KACd2tB,KAAAA,WAAW3tB,GAAS,IAEtB2tB,KAAAA,WAAW3tB,GAAO7B,KAAK0lB,KAC7B,CAAAnsB,IAAA,MAAAC,MAED,SAAKqI,EAAO6jB,GACN,GAACrtB,KAAKm3B,WAAW3tB,GAAjB,CAKJ,IAFMmR,IAAAA,EAAW3a,KAAKm3B,WAAW3tB,GAC7BpI,GAAQ,EACHO,EAAI,EAAGA,EAAIgZ,EAAS/a,OAAQ+B,IAC/BgZ,GAAAA,EAAShZ,KAAO0rB,EAAS,CAC3BjsB,EAAQO,EACR,MAGAP,GAAS,GACXpB,KAAKm3B,WAAW3tB,GAAO6C,OAAOjL,EAAO,MAExC,CAAAF,IAAA,UAAAC,MAED,SAASqI,EAAO7C,GACT3G,KAAKm3B,WAAW3tB,IAGrBxJ,KAAKm3B,WAAW3tB,GAAO5B,KAAI,SAAAylB,GACrB,IACFA,EAAQ1mB,SACD1H,GACPgB,QAAQhB,MAAKmB,aAAAA,OAAcoJ,GAASvK,SAGzC,CAAAiC,IAAA,UAAAC,MAqDD,WAAW,IAAAymB,EAAA5nB,KACH4H,EAAM,CACVgpD,SAAU,aACVC,UAAW,cACXlH,WAAY,gBAEdjkD,OAAOC,KAAKiC,GAAKhC,SAAQ,SAAA1E,GACvB0mB,EAAK5U,KAAKoV,oBAAoBlnB,EAAK0mB,EAAKhgB,EAAI1G,YAE/CouD,EApKS,2qBCTNwB,GACE,OADFA,GAEK,UAFLA,GAGM,eAINhD,GAAQ,CAAC,aAAc,gBAEvBiD,YAAYxwB,GAAAtkB,EAAA80C,EAAAxwB,GAAArkB,IAAAA,EAAAC,EAAA40C,GAoChB,SAAAA,EAAa5uD,GAASikB,IAAAA,EA6BOA,OA7BPplB,OAAA+vD,GAEpB9oC,EAAAuY,EADAtkB,EAAAA,EAAAzV,UAAMtE,IA4SO,gBAAA,SAACwE,GACd,IAAA85B,EAAAD,EAAApa,GAAQzR,EAAM8rB,EAAN9rB,OAAQtV,EAAMohC,EAANphC,OAAQ8T,EAAGstB,EAAHttB,IAAKyc,EAAY6Q,EAAZ7Q,aACvBohC,EAAS5qC,EAAK6qC,UAAUtqD,GAS1BqqD,GANJ5qC,EAAK2oC,gBAAiB,EAClB3oC,EAAK8qC,mBACPvsD,aAAayhB,EAAK8qC,kBAClB9qC,EAAK8qC,iBAAmB,MAGtBF,IAAW3xD,EAAO8xD,gBAAkB/qC,EAAKvT,SAAW,IAAM8B,EAAOU,MAAO,CAC1ElC,EAAIwsC,SAAU,EACTyR,EAAAA,OAASzsD,aAAayhB,EAAKgrC,OAEhCt7C,EAAK3H,gBAAgByhB,EAAa4O,sBAAwB5O,EAAa4O,sBACvEpY,EAAKqP,KAAK,WAAWhwB,UAAYqQ,EAAK7M,OAAOmd,EAAKvT,UAE5Cw+C,IAAAA,EAAOjrC,EAAKpT,KAAKu0B,wBACE,KAArB5yB,EAAO0vB,WACTlxB,EAAIqwB,IAAM6tB,EAAKxwB,KACf1tB,EAAI0tB,KAAOwwB,EAAK7tB,IAChBrwB,EAAIzG,MAAQ2kD,EAAK1kD,OACjBwG,EAAIxG,OAAS0kD,EAAK3kD,QAElByG,EAAIqwB,IAAM6tB,EAAK7tB,IACfrwB,EAAI0tB,KAAOwwB,EAAKxwB,KAChB1tB,EAAIzG,MAAQ2kD,EAAK3kD,MACjByG,EAAIxG,OAAS0kD,EAAK1kD,QAEpB,IAAM2kD,EAAKzjD,SAASmjD,EAAOjnD,MAAQoJ,EAAI0tB,KAAM,IACvC0wB,EAAK1jD,SAASmjD,EAAO7mD,MAAQgJ,EAAIqwB,IAAK,IAE5CrwB,EAAIrC,EAAyB,KAArB6D,EAAO0vB,UAAmBktB,EAAKD,EACvCn+C,EAAIpC,EAAyB,KAArB4D,EAAO0vB,UAAmBitB,EAAKC,EACnCC,EAAAA,OAASnyD,EAAOmyD,OAASr+C,EAAIzG,MACjCyG,EAAIs+C,QAAU,EAAIpyD,EAAOoyD,QAAUt+C,EAAIzG,MACvCyG,EAAIu+C,QAAUv+C,EAAIzG,OAAS,EAAIrN,EAAOsyD,QAAU,EAC5CC,EAAAA,QAAUz+C,EAAIzG,MAAQyG,EAAIu+C,YAEjCzpC,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GACPqqD,IAAAA,EAAS5qC,EAAK6qC,UAAUtqD,GAC9BunD,EAAA1tB,EAAApa,GAAQjT,EAAG+6C,EAAH/6C,IAAK9T,EAAM6uD,EAAN7uD,OAAQsV,EAAMu5C,EAANv5C,OACjB,GAACq8C,IAAU3xD,EAAO8xD,gBAAmB/qC,EAAKvT,UAAaM,EAAIwsC,QAA3D,CAGJ,IAAQ1G,EAAqC55C,EAArC45C,aAAc4Y,EAAuBxyD,EAAvBwyD,mBAEhBP,EAAKzjD,SAASmjD,EAAOjnD,MAAQoJ,EAAI0tB,KAAM,IACvC0wB,EAAK1jD,SAASmjD,EAAO7mD,MAAQgJ,EAAIqwB,IAAK,IAEtC1yB,EAAyB,KAArB6D,EAAO0vB,UAAmBktB,EAAKD,EACnCvgD,EAAyB,KAArB4D,EAAO0vB,UAAmBitB,EAAKC,EAEzC,GAAIptD,KAAK0P,IAAI/C,EAAIqC,EAAIrC,GAAKmoC,GAAgB90C,KAAK0P,IAAI9C,EAAIoC,EAAIpC,GAAKkoC,EAAc,CACtE8W,IAAAA,EAAQj/C,EAAIqC,EAAIrC,EAChBk/C,EAAQj/C,EAAIoC,EAAIpC,EAClB+gD,EAAQ3+C,EAAI2+C,MAUZA,IATc,IAAdA,IAGY,KAFdA,EAAQ1rC,EAAK2rC,WAAWjhD,EAAGC,EAAGg/C,EAAOC,EAAO78C,MAGzC0+C,EAAyDl9C,EAAOysB,OAA3CzsB,EAAO+rB,MAAM,CAAEC,UAAU,KAC9CxtB,EAAIjQ,OAASiQ,EAAIjQ,KAAO2K,SAA8B,IAArB8G,EAAOT,YAAoB,IAAwB,IAAlBkS,EAAKsZ,aAE1EvsB,EAAI2+C,MAAQA,IAEOA,IAAjBA,GAAiBA,EAAQ,IAAMzyD,EAAO2yD,UAAwB,IAAVF,IAAgBzyD,EAAO4yD,SAC7E,OAGF7rC,EAAK8rC,YAAYnC,EAAOC,EAAO8B,EAAO3+C,EAAIzG,MAAOyG,EAAIxG,QACrDwG,EAAIrC,EAAIA,EACRqC,EAAIpC,EAAIA,OAIXkX,EAAAuY,EAAApa,GAEY,cAAA,SAACzf,GACZ6yC,IAAAA,EAAAhZ,EAAApa,GAAQzR,EAAM6kC,EAAN7kC,OAAQxB,EAAGqmC,EAAHrmC,IAAKyc,EAAY4pB,EAAZ5pB,aAajB,GAVAxJ,EAAK8qC,kBACPvsD,aAAayhB,EAAK8qC,kBAEfA,EAAAA,iBAAmBztD,YAAW,WACjC2iB,EAAK2oC,gBAAiB,IACrB,IAEHtrD,YAAW,WACTkR,EAAO+b,UAAU,aAAe/b,EAAO+b,UAAU,YAAYmqB,mBAC5D,IACE1nC,EAAIwsC,QAAL,CAGAxsC,EAAI2+C,OAAY,GAChBhM,EAAAA,YAAcn/C,EAAEutC,iBAGpB,IAAAtT,EAAqCxa,EAAK/mB,OAAlC8xD,EAAcvwB,EAAduwB,eAAgBc,EAAQrxB,EAARqxB,UACnBd,GAAkBc,EAChBE,EAAAA,YAAYh/C,EAAI2+C,OAErB3+C,EAAIjQ,KAAO,EAEbiQ,EAAI2+C,OAAQ,EACZ1rC,EAAKgsC,WACLt8C,EAAK3H,gBAAgByhB,EAAa6O,qBAAuB7O,EAAa6O,qBACjE4zB,EAAAA,aAAavB,QACnB7oC,EAAAuY,EAAApa,GAUiB,mBAAA,SAACzf,IACbyf,EAAK/mB,OAAO8xD,gBAAmB/qC,EAAK/mB,OAAO4yD,UAG3C7rC,EAAKksC,kBAAkB3rD,KACzBA,EAAE+I,kBACG0W,EAAKjT,IAAIwsC,QAGZv5B,EAAKspC,YAAY/oD,GAFjByf,EAAKsqC,aAAa/pD,OAKvBshB,EAAAuY,EAAApa,GAEgB,kBAAA,SAACzf,GACZyf,EAAKjT,IAAI2+C,OAAY,GACvB1rC,EAAKopC,WAAW7oD,MAlblByf,EAAKjT,IAAM,CACTwsC,SAAS,EACT7uC,EAAG,EACHC,EAAG,EACH7N,KAAM,EACNuiB,OAAQ,EACRuE,KAAM,EACNuoC,MAAO,EACP7lD,MAAO,EACPC,OAAQ,EACR6kD,OAAQ,EACRC,OAAQ,EACRC,QAAS,EACTE,QAAS,EACTE,OAAO,GAKT1rC,EAAKgrC,MAAQ,KAKbhrC,EAAK2oC,gBAAiB,EAAK3oC,EA/B5B2qC,OAgCA9vD,EAAA8vD,EAAA,CAAA,CAAA7vD,IAAA,WAAAK,IAED,WACE,OAAOvB,KAAK4vB,aAAa6P,gBAAkBz/B,KAAK2U,OAAO9B,WACxD,CAAA3R,IAAA,aAAAK,IAED,WACS,OAAAvB,KAAK4vB,aAAa8P,YAAc,IACxC,CAAAx+B,IAAA,gBAAAC,MAED,WACS,MAAA,CACLqxD,YAAa,CAAEp/B,KAAMq/B,GAAa5+B,MAAO,kBAE5C,CAAA3yB,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACP4H,GAAAA,KAAI,SAAA/B,GACR6hB,EAAKkG,QAAQ/nB,GAAQ,QAEvB,IAAQ+pB,EAAiC5vB,KAAjC4vB,aAAcvwB,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,QACU,IAApCib,EAAagO,qBACfv+B,EAAOqzD,cAAe,GAExB1yD,KAAKoyD,WACAt8C,EAAKtH,YAAYohB,EAAauhC,kBAC1BA,EAAAA,iBAAmBvhC,EAAauhC,gBAEzCnxD,KAAKiT,YAAY,gBAAiBjT,KAAK2zB,MAAM6+B,aAE7CxyD,KAAK2yD,OAAS78C,EAAK9Q,UAAU,UAAW,GAAI,GAAI,UACzCgO,EAAAA,KAAKC,YAAYjT,KAAK2yD,QAE7B3yD,KAAKk8C,kBAELl8C,KAAK4yD,oBAEL,IAAMj9B,EAAkC,UAAtB31B,KAAKiwB,aAA2B,QAAU,QAC5DjwB,KAAK0J,MAAQ,IAAI4lD,GAAOtvD,KAAKgT,KAAM,CAAE2iB,UAAAA,EAAW26B,oBAAqBtwD,KAAKX,OAAO8xD,iBAEjFnxD,KAAKgT,KAAKkV,iBAAiB,eAAe,SAAAvhB,GACxCA,EAAEutC,oBAMJv/B,EAAO3B,KAAKkV,iBAAiB,YAAaloB,KAAK6yD,iBAAiB,GAChEl+C,EAAO3B,KAAKkV,iBAAiB,WAAYloB,KAAK8yD,gBAAgB,GAC9Dn+C,EAAO3B,KAAKkV,iBAAiB,cAAeloB,KAAK8yD,gBAAgB,GACzDtsC,IAAAA,EAAaxmB,KAAK2U,OAAlB6R,SACJA,GAAYA,EAASsa,SACvBta,EAASsa,OAAO5Y,iBAAiB,YAAaloB,KAAK6yD,iBAAiB,GACpErsC,EAASsa,OAAO5Y,iBAAiB,WAAYloB,KAAK8yD,gBAAgB,GAClEtsC,EAASsa,OAAO5Y,iBAAiB,cAAeloB,KAAK8yD,gBAAgB,IAElEv3C,KAAAA,GAAG9B,GAAwB,WAC9B,IAAQ9E,EAAmB+S,EAAnB/S,OAAQtV,EAAWqoB,EAAXroB,OACZsV,EAAO9B,SAAW,GAAuB,IAAlB8B,EAAO9B,SAAkBxT,EAAO0zD,eACzD1zD,EAAO0zD,aAAiC,IAAlBp+C,EAAO9B,aAIjC7S,KAAKub,GAAG,CAAC9B,EAAgBA,IAAe,WACtC,IAAAu5C,EAA0BtrC,EAAKvU,IAAvBjQ,EAAI8vD,EAAJ9vD,MAAa8vD,EAAPrT,SACEz8C,EAAO,IACrBwkB,EAAKvU,IAAIjQ,KAAO,MAIpB,IAAM+vD,EAAY,CAChBtJ,WAAY,eACZkH,UAAW,cACXD,SAAU,aACVf,MAAO,UACPqD,SAAU,aACVC,MAAO,UACPC,YAAa,aASX,GANJ1tD,OAAOC,KAAKstD,GAAWrrD,KAAI,SAAA1G,GACzBwmB,EAAKhe,MAAM6R,GAAGra,GAAK,SAACyF,GACbssD,EAAAA,EAAU/xD,IAAMyF,UAIpBtH,EAAOg0D,cAAe,CAEnBC,IAAAA,EAAiB3+C,EAAO+Z,QAAQ6kC,SAClCD,IACaE,EAAAA,YAAY,YAAY,SAAC5oC,GACtClD,EAAK+rC,eAAe7oC,EAAK1W,YAAa0W,EAAK6uB,YAE7C,CAAC,UAAW,SAAS7zC,SAAQ,SAAA1E,GACZsyD,EAAAA,YAAYtyD,GAAK,WACzBmxD,EAAAA,aAAavB,cAK3B,CAAA5vD,IAAA,oBAAAC,MAED,WACE,IACQw+B,EADW3/B,KAAX2U,OACqB+Z,QAArBiR,UACJA,GAAAA,GAAaA,EAAU+zB,OAAQ,CACjC1zD,KAAK2/B,UAAYA,EAAUg0B,gBAAgB,KAAM,oBAC3CC,IAAAA,EAAc5zD,KAAKy1B,KAAK,iBAC9Bm+B,EAAYj9B,aAAa32B,KAAK2/B,UAAWi0B,EAAYztD,SAAS,OAEjE,CAAAjF,IAAA,kBAAAC,MAED,WACE,IAAQ2+B,GAAgB9/B,KAAK4vB,cAAgB,IAArCkQ,YACAE,EAA8EF,EAA9EE,YAAaD,EAAiED,EAAjEC,cAAe8zB,EAAkD/zB,EAAlD+zB,iBAAkBC,EAAgCh0B,EAAhCg0B,aAAcC,EAAkBj0B,EAAlBi0B,cAOpE,GANI/zB,IACFhgC,KAAKy1B,KAAK,cAAczoB,MAAMwzC,gBAAkBxgB,GAE9CD,IACF//B,KAAKy1B,KAAK,WAAWzoB,MAAMwzC,gBAAkBzgB,GAE3C8zB,EAAkB,CACdG,IAAAA,EAAah0D,KAAKy1B,KAAK,iBAC7B/vB,OAAOC,KAAKkuD,GAAkBjuD,SAAQ,SAAA1E,GACzB8L,EAAAA,MAAM9L,GAAO2yD,EAAiB3yD,MAG7C,IAAM+yD,EAAWH,GAAgB9zB,EAC3Bk0B,EAAWH,EACjBE,IAAaj0D,KAAKy1B,KAAK,WAAWzoB,MAAMmnD,MAAQF,GAChDC,IAAal0D,KAAKy1B,KAAK,WAAWzoB,MAAMmnD,MAAQD,GAC3C70D,KAAAA,OAAO+0D,qBAAuBt+C,EAAK1P,SAASpG,KAAKy1B,KAAK,eAAgB,UAC5E,CAAAv0B,IAAA,WAAAC,MAED,WAAoB,IAAAwmB,EAAA3nB,KACdA,KAAKmT,KACPnT,KAAKmT,IAAIwsC,SAAU,EACnB3/C,KAAKmT,IAAI2+C,OAAQ,EAChB,CAAA,IAAK,IAAK,QAAS,SAAU,SAAU,SAAU,UAAW,WAAWlqD,KAAI,SAAA/B,GAC1E8hB,EAAKxU,IAAItN,GAAQ,MAGnB7F,KAAKmT,IAAM,CACTwsC,SAAS,EACT7uC,EAAG,EACHC,EAAG,EACH0U,OAAQ,EACRuE,KAAM,EACNuoC,MAAO,EACP7lD,MAAO,EACPC,OAAQ,EACR6kD,OAAQ,EACRC,OAAQ,EACRC,QAAS,EACTE,QAAS,EACTE,OAAO,EACP5uD,KAAM,KAGX,CAAAhC,IAAA,eAAAC,MAED,SAAcivB,GACZ,IAAQzb,EAAiB3U,KAAjB2U,OAAiB3U,KAATgT,KACXlN,aAAa,iBAAkBsqB,GAC9BikC,IAAAA,EAAc1/C,EAAO+Z,QAAQrtB,MACnCgzD,GAAeA,EAAYC,YAC5B,CAAApzD,IAAA,YAAAC,MAED,SAAWwF,GACS3G,KAAK2U,OAAO0vB,UAAxBA,IACA2sB,EAASrqD,EAAE8C,SAAW9C,EAAE8C,QAAQ7J,OAAS,EAAI+G,EAAE8C,QAAQ9C,EAAE8C,QAAQ7J,OAAS,GAAK+G,EAgBrF,MACI,CACAoD,MAAOinD,EAAOjnD,MACdI,MAAO6mD,EAAO7mD,SAQpB,CAAAjJ,IAAA,aAAAC,MASA,SAAY2P,EAAGC,EAAGg/C,EAAOC,EAAO78C,GAC9B,IAAQzG,EAAUyG,EAAVzG,MACJolD,GAAQ,EACRhhD,GAAAA,EAAI,GAAKA,EAAIpE,EACRolD,OAAAA,EAEHyC,IAAAA,EAAiB,IAAVvE,EAAc7rD,KAAK0P,IAAIk8C,GAAS5rD,KAAK0P,IAAIk8C,EAAQC,GAMvD8B,OALH3tD,KAAK0P,IAAIk8C,GAAS,GAAKwE,GAAQ,MAAQzjD,EAAIqC,EAAIu+C,SAAW5gD,EAAIqC,EAAIy+C,QAC5DE,EAAA,GACqB,IAApB3tD,KAAK0P,IAAIk8C,IAAgBwE,GAAQ,OAC1CzC,EAAQhhD,EAAIqC,EAAIq+C,OAAS,EAAK1gD,EAAIqC,EAAIs+C,OAAS,EAAI,GAE9CK,IAGT,CAAA5wD,IAAA,cAAAC,MAQA,SAAa4uD,EAAOC,EAAO8B,EAAOplD,EAAOC,GAC/BmlD,OAAAA,GACD,KAAA,EACH9xD,KAAK49C,WAAWmS,EAAQrjD,EAAQ1M,KAAKX,OAAOsyD,QAC5C,MACG,KAAA,EACE6C,KAAAA,iBAAiBxE,EAAQrjD,GAC9B,MACG,KAAA,EAEEwa,GAAQ/F,GAAGyB,OACT4xC,KAAAA,aAAazE,EAAQrjD,MAOlC,CAAAzL,IAAA,cAAAC,MAKA,SAAauzD,GAAW,IAAA9sC,EAAA5nB,KACdmT,EAAwBnT,KAAxBmT,IAAKwB,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OAEf6D,GAAQiQ,EAAIjQ,KAAOlD,KAAK0/B,YAAc,IACpCg1B,GACD,IADCA,EAEJ//C,EAAOkpC,KAAKvnB,OAAOpzB,GAAMw6C,QAAQ,IACjCr+C,EAAOs1D,gBAAkBhgD,EAAOysB,OAASzsB,EAAO+rB,QAC3C0wB,KAAAA,MAAQ3tD,YAAW,WACtBmkB,EAAKzU,IAAIjQ,KAAO,IACf,KAMFmvD,KAAAA,aAAavB,MACnB,CAAA5vD,IAAA,oBAAAC,MAoHD,SAAmBwF,GACjB,IAAM+nB,EAAU1uB,KAAK2U,OAAO+Z,SAAW,GACnCA,QAAAA,EAAQ6kC,WAAY7kC,EAAQ6kC,SAASvgD,KAAKsZ,SAAS3lB,EAAEqD,WAGjD0kB,EAAQrtB,OAASqtB,EAAQrtB,MAAM2R,KAAKsZ,SAAS3lB,EAAEqD,SAAa0kB,EAAQlI,UAAYkI,EAAQlI,SAASxT,KAAKsZ,SAAS3lB,EAAEqD,WAC1H,CAAA9I,IAAA,gBAAAC,MAwBD,SAAeqI,GACL6b,IAAAA,EAAWrlB,KAAK2U,OAAhB0Q,OACHmL,KAAAA,eAAehnB,EAAO,oBAAqB,CAC9Ck5B,KAAM,SACNC,KAAMtd,EACNud,IAAKvd,MAER,CAAAnkB,IAAA,eAAAC,MAED,SAAcwF,GACZ,IAAQgO,EAAiC3U,KAAjC2U,OAAQtV,EAAyBW,KAAzBX,OAAQuwB,EAAiB5vB,KAAjB4vB,aACpBjb,EAAO+xB,MAAQtG,GACZxQ,EAAa+N,kBAChB39B,KAAK40D,cAAc9+C,EAAKrD,YAAY,UACpCkC,EAAO+U,SAKNrqB,EAAOqzD,cAAgB9iC,EAAa+N,gBACvChpB,EAAO+H,SAAW/H,EAAOysB,OAASzsB,EAAO+rB,QAC/B9Q,EAAa+N,mBACnBhpB,EAAO+H,UAAYrd,EAAOw1D,mBAC5B70D,KAAK40D,cAAc9+C,EAAKrD,YAAY,UACpCzS,KAAKuuD,mBAEP55C,EAAO+rB,WAEV,CAAAx/B,IAAA,iBAAAC,MAED,SAAgBwF,GACd,IAAQtH,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,QACXtV,EAAOqzD,cAAgB/9C,EAAO+xB,OAAStG,KAC1CpgC,KAAK40D,cAAc9+C,EAAKrD,YAAY,aACpCzS,KAAKuuD,qBAER,CAAArtD,IAAA,UAAAC,MAED,SAASwF,GAAG,IAAAwhB,EAAAnoB,KACF2U,EAAW3U,KAAX2U,OACRqZ,GAAShuB,KAAM8tD,GAAM,IAAI,SAACn/B,EAAQ/D,GAC3Bg7B,EAAAA,aAAah7B,EAAKjkB,KACtB,CAAEA,EAAAA,EAAG0e,OAAQ1Q,EAAO0Q,WACxB,CAAAnkB,IAAA,YAAAC,MAED,SAAWwF,GAAG,IAAA2hB,EAAAtoB,KACJ2U,EAAW3U,KAAX2U,OACRqZ,GAAShuB,KAAM8tD,GAAM,IAAI,SAACn/B,EAAQ/D,GAC3BkqC,EAAAA,eAAelqC,EAAKjkB,KACxB,CAAEA,EAAAA,EAAG0e,OAAQ1Q,EAAO0Q,WACxB,CAAAnkB,IAAA,UAAAC,MAED,SAASwF,GACP,IAAQwM,EAAwBnT,KAAxBmT,IAAK9T,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACjBtV,EAAO+wD,eAGPpmC,EAAAA,KAAOhqB,KAAK2U,OAAOmR,aAClB0K,KAAAA,eAAe,QAAS,cAAe,CAC1CkS,KAAM,eACNC,KAAMhuB,EAAOmR,aACb8c,GAAIvjC,EAAO01D,YAEbpgD,EAAOmR,aAAezmB,EAAO01D,UACxB1C,KAAAA,aAAavB,OACnB,CAAA5vD,IAAA,aAAAC,MAED,SAAYwF,GACV,IAAQwM,EAAwBnT,KAAxBmT,IAAK9T,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACjBtV,EAAO+wD,eAGN5/B,KAAAA,eAAe,WAAY,cAAe,CAAEkS,KAAM,eAAgBC,KAAMhuB,EAAOmR,aAAc8c,GAAIzvB,EAAI6W,OAC1GrV,EAAOmR,aAAe3S,EAAI6W,KAC1B7W,EAAI6W,KAAO,EACNqoC,KAAAA,aAAavB,OACnB,CAAA5vD,IAAA,aAAAC,MAED,SAAYy1C,GACV,IAAQjiC,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OACRwT,EAAa7S,KAAK2U,OAAlB9B,SACR+jC,EAAUtgB,OAAOsgB,EAAQ8G,QAAQ,IACjC,IAAIx6C,EAAO2K,SAAS+oC,EAAUv3C,EAAO0zD,aAAc,IAAM/yD,KAAK0/B,WAEvDx8B,GADPA,GAAQlD,KAAKmT,IAAIjQ,MACH,EAAI,EAAKA,EAAkB,IAAX2P,EAA6B,IAAXA,EAAkB,IAAM3P,EACjEwtB,EAAAA,UAAU,SAAW/b,EAAO+b,UAAU,QAAQktB,WAAW16C,EAAO,KACvEyR,EAAO+b,UAAU,aAAe/b,EAAO+b,UAAU,YAAYitB,cAAcz6C,EAAO,IAAOlD,KAAK6S,UAAU,GACxG7S,KAAKyzD,eAAevwD,EAAO,IAAM0zC,EAAU,GAEvCv3C,EAAO21D,gBAEFnX,EAAAA,KAAKvnB,QAAQpzB,EAAOlD,KAAK0/B,YAAc,KAAMge,QAAQ,IAE9D19C,KAAKmT,IAAIjQ,KAAOA,IACjB,CAAAhC,IAAA,eAAAC,MAED,SAAcy1C,GACR52C,KAAK2U,OAAO0vB,YACduS,GAAWA,GAEb,IAAQjiC,EAAgB3U,KAAhB2U,OAAQxB,EAAQnT,KAARmT,IAGhB,GAFUtF,EAAAA,SAAmB,IAAV+oC,EAAe,IAClCzjC,EAAIsS,QAAUmxB,IACVzyC,KAAK0P,IAAIV,EAAIsS,QAAU,IAA3B,CAGIA,IAAAA,EAAS5X,SAAyB,GAAhB8G,EAAO8Q,OAAa,IAAM5X,SAASsF,EAAIsS,OAAS,GAAI,IAC1EA,EAASA,EAAS,GAAK,GAAMA,EAAS,EAAI,EAAIA,EAC9C9Q,EAAO8Q,OAASA,EAAS,GACzBtS,EAAIsS,OAAS,KACd,CAAAvkB,IAAA,mBAAAC,MAED,SAAkBy1C,GAChB,IAAQzjC,EAAwBnT,KAAxBmT,IAAK9T,EAAmBW,KAAnBX,OAAQszD,EAAW3yD,KAAX2yD,OACjB,GAACtzD,EAAO41D,SAAR,CAGAj1D,KAAK2U,OAAO0vB,YACduS,GAAWA,GAET2b,IAAAA,EAAQp/C,EAAIo/C,MAAS,GAAM3b,EAC/B2b,EAAQA,EAAQlzD,EAAO61D,YAAc71D,EAAO61D,YAAe3C,EAAQ,EAAI,EAAIA,EACvEI,IACFA,EAAO3lD,MAAMwzC,8BAAepgD,OAAiBmyD,EAAQ,MAEvDp/C,EAAIo/C,MAAQA,KACb,CAAArxD,IAAA,iBAAAC,MAED,SAAgB+B,GAAMiyD,IAAAA,IAASx1D,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GACrBgV,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OACV+9B,IAAWp9B,KAAK6S,WAAaoX,EAAAA,GAAYjqB,KAAK6S,SAAW,GAC/D,GAAK3P,GAAwB,iBAATA,IAAqBk6B,IAAU/9B,EAAOg0D,cAA1D,CAGInwD,EAAO,EACFA,EAAA,EACEA,EAAOyR,EAAO9B,WACvB3P,EAAOyR,EAAO9B,SAAW,IAEtBw/C,KAAAA,aAAavB,IAEZuD,IAAAA,EAAc1/C,EAAO+Z,QAAQrtB,MACnCgzD,GAAeA,EAAYe,YAE3Bp1D,KAAKy1B,KAAK,WAAWhwB,UAAYqQ,EAAK7M,OAAOjJ,KAAK6S,UAClD7S,KAAKy1B,KAAK,WAAWhwB,UAAYqQ,EAAK7M,OAAO/F,GACxCuyB,KAAAA,KAAK,cAAczoB,MAAMN,SAAKtM,OAAM8C,EAAOlD,KAAK6S,SAAW,IAAM,KAClEsiD,EACFr/C,EAAK3O,YAAYnH,KAAKy1B,KAAK,iBAAkB,WAE7C3f,EAAK1P,SAASpG,KAAKy1B,KAAK,iBAAkB,WAE5Cz1B,KAAKq1D,iBAAiBnyD,MAGvB,CAAAhC,IAAA,mBAAAC,MAED,SAAkB+B,GAChB,IACQy8B,EADW3/B,KAAX2U,OACqB+Z,QAArBiR,UACJA,GAAaA,EAAU+zB,QACzB1zD,KAAK2/B,WAAaA,EAAUkT,OAAO7yC,KAAK2/B,UAAWz8B,EAAM,IAAK,MAGjE,CAAAhC,IAAA,kBAAAC,MAED,WACE,IAAQwT,EAAW3U,KAAX2U,OACJA,GAAAA,EAAO+xB,MAAQtG,GACV,OAAA,EACGzrB,EAAOU,QACbV,EAAO0Q,OACT1Q,EAAO+U,OAEP/U,EAAO4U,WAKb,CAAAroB,IAAA,iBAAAC,MACA,WACEnB,KAAKX,OAAO8xD,gBAAiB,IAG/B,CAAAjwD,IAAA,gBAAAC,MACA,WACEnB,KAAKX,OAAO8xD,gBAAiB,IAC9B,CAAAjwD,IAAA,UAAAC,MAED,WACE,IAAQwT,EAAW3U,KAAX2U,OACHy8C,KAAAA,OAASzsD,aAAa3E,KAAKoxD,OAChCpxD,KAAK2/B,UAAY,KACV3sB,EAAAA,KAAK6V,YAAY7oB,KAAK2yD,QAC7B3yD,KAAK2yD,OAAS,KACTjpD,KAAAA,OAAS1J,KAAK0J,MAAMknB,UACzB5wB,KAAK0J,MAAQ,KACbiL,EAAO3B,KAAKoV,oBAAoB,YAAapoB,KAAK6yD,iBAAiB,GACnEl+C,EAAO3B,KAAKoV,oBAAoB,WAAYpoB,KAAK8yD,gBAAgB,GACjEn+C,EAAO3B,KAAKoV,oBAAoB,cAAepoB,KAAK8yD,gBAAgB,GAC5DtsC,IAAAA,EAAaxmB,KAAK2U,OAAlB6R,SACJA,GAAYA,EAASsa,SACvBta,EAASsa,OAAO1Y,oBAAoB,YAAapoB,KAAK6yD,iBAAiB,GACvErsC,EAASsa,OAAO1Y,oBAAoB,WAAYpoB,KAAK8yD,gBAAgB,GACrEtsC,EAASsa,OAAO1Y,oBAAoB,cAAepoB,KAAK8yD,gBAAgB,MAE3E,CAAA5xD,IAAA,SAAAC,MAED,WACQqE,IAAAA,EAAqC,WAAzBxF,KAAKX,OAAOi2D,SAAqBl1D,YAAAA,OAAeJ,KAAKX,OAAOi2D,UAAa,WAC3F,MAAA,yDAAAl1D,OAEeoF,EAAS,uFAAApF,OAEWJ,KAAKX,OAAOk2D,gBAAkB,kBAAoB,GAAEn1D,yaAAAA,OAWpEJ,KAAKX,OAAO01D,UAAS30D,SAAAA,OAAQJ,KAAKoV,KAAKkL,QAAO,wDAIlE,CAAA,CAAApf,IAAA,aAAAK,IArsBD,WACS,MAAA,WAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLH,MAAO,EACP+vD,gBAAgB,EAChBc,UAAU,EACVD,UAAU,EACVsD,SAAU,SACVN,gBAAgB,EAChB/b,aAAc,EACduc,SAAU,EACVhE,OAAQ,IACRC,OAAQ,IACRE,OAAQ,GACRoD,UAAW,EACXE,UAAU,EACVC,YAAa,GACb7B,eAAe,EACfe,qBAAqB,EACrBvC,oBAAoB,EACpB8C,iBAAiB,EACjB5B,aAAc,KACdL,cAAc,EACdtC,cAAc,EACdmF,iBAAiB,EACjBV,iBAAiB,OAEpB9D,GAlCwB/8B,ICxB3B,SAASyhC,GAAcxwD,GACrB,IAAMsG,EAAUtG,EAAGsG,QAEnB,QAAgB,UAAZA,GAAmC,aAAZA,IAA0BtG,EAAGywD,mBAOpDC,IAAAA,YAAQ1hC,GAAAhY,EAAA05C,EAAA1hC,GAAA/X,IAAAA,EAAAC,EAAAw5C,GAAA,SAAAA,IAAAvvC,IAAAA,EAAAplB,OAAA20D,GAAA,IAAA,IAAAj2D,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAqTXqmB,OArTW6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAyPI,iBAAA,SAACqG,GACX,GAAC4c,EAAKzR,OAAN,CAGEhO,IAAAA,EAAI6C,GAAS7K,OAAO6K,MACpBosD,EAAUjvD,EAAEivD,QAClBn1B,EAAAD,EAAApa,GAAQyvC,EAASp1B,EAATo1B,UAAWlhD,EAAM8rB,EAAN9rB,OACnBisB,EAA4Dxa,EAAK/mB,OAAzDm2B,EAAOoL,EAAPpL,QAASsgC,EAAkBl1B,EAAlBk1B,mBAAoBC,EAAkBn1B,EAAlBm1B,mBAEjCvgC,GAAWsgC,IAAwBnhD,EAAO2H,eAAgBy5C,GAAuBN,GAAa9uD,EAAEqD,UAAYoc,EAAK4vC,kBAAoBrvD,EAAEsvD,SAAWtvD,EAAEuvD,QAAUvvD,EAAEwvD,QAClKN,EAAUO,eAAgB,GAIvB5sD,EAAM6sD,QAAWR,EAAUS,aACzB3vD,EAAEqD,SAAW1E,SAASwK,MAASsW,EAAK/mB,OAAOk3D,kBAAoBd,GAAa9uD,EAAEqD,UAAaoc,EAAKowC,UAAUZ,GAAS,KACtHC,EAAUO,eAAgB,GAEnBluC,SAAAA,iBAAiB,QAAS9B,EAAKqwC,cAEhCL,EAAAA,eAAiBhwC,EAAKswC,cAAc/vD,QAC/CshB,EAAAuY,EAAApa,GAEa,eAAA,SAAC5c,GACR4c,EAAKzR,SAGDyT,SAAAA,oBAAoB,QAAShC,EAAKqwC,aAC3CrwC,EAAKuwC,YAAYntD,OAClBye,EAAAuY,EAAApa,GAEW,aAAA,SAAC5c,GACP,GAAC4c,EAAKzR,OAAN,CAGEhO,IAAAA,EAAI6C,GAAS7K,OAAO6K,MAClBqsD,EAARr1B,EAAApa,GAAQyvC,UAEJ,IAAClvD,EAAE0vD,OAAQ,CACTjwC,GAAAA,EAAK/mB,OAAOm2B,SAAWpP,EAAK/mB,OAAOu3D,oBAAsBjwD,EAAEsvD,SAAWtvD,EAAEuvD,QAAUvvD,EAAEwvD,QACtF,QAEExvD,GAAoB,KAAdA,EAAEivD,UAAkBxvC,EAAKowC,UAAU7vD,EAAEivD,UAAcjvD,EAAEqD,SAAWoc,EAAKzR,OAAO3B,MAAQrM,EAAEqD,SAAWoc,EAAKzR,OAAO/C,OAASjL,EAAEqD,SAAWoc,EAAKzR,OAAO6R,SAASvhB,KAChK4wD,EAAUS,WAAY,GAExBlwC,EAAKzR,OAAO3B,KAAKkV,iBAAiB,QAAS9B,EAAKywC,SAG7ChB,EAAUS,WAGflwC,EAAKswC,cAAc/vD,OACpBshB,EAAAuY,EAAApa,GAES,WAAA,SAAC5c,GACJ4c,EAAKzR,SAGVyR,EAAKzR,OAAO3B,KAAKoV,oBAAoB,QAAShC,EAAKywC,SACnDzwC,EAAKuwC,YAAYntD,OAClB4c,EAjSAuvC,OAiSA10D,EAAA00D,EAAA,CAAA,CAAAz0D,IAAA,kBAAAC,MA/RD,WAAmB,IAAAumB,EAAA1nB,KACX82D,EAAmB92D,KAAKX,OAAO03D,WACjCD,GACFpxD,OAAOC,KAAKmxD,GAAkBlvD,KAAI,SAAA1G,GAC3BwmB,EAAKqvC,WAAW71D,GAGlB,CAAA,UAAW,SAAU,UAAW,cAAe,eAAgB,gBAAgB0G,KAAI,SAAAovD,GAClFF,EAAiB51D,GAAK81D,KAAUtvC,EAAKqvC,WAAW71D,GAAK81D,GAAQF,EAAiB51D,GAAK81D,OAHhFD,EAAAA,WAAW71D,GAAO41D,EAAiB51D,QAQ/C,CAAAA,IAAA,cAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAWx1B,KAAK4vB,aAAa0P,YACzC,IAAM23B,EAA2C,mBAAzBj3D,KAAKX,OAAO43D,SAA0Bj3D,KAAKX,OAAO43D,SAASj3D,KAAK2U,QAAU3U,KAAKX,OAAO43D,SACvGA,GAAgC,iBAAbA,IACxBj3D,KAAKi3D,SAAWA,GAElBj3D,KAAK+2D,WAAa,CAChBG,MAAO,CACLtB,QAAS,GACTxlC,OAAQ,YACRoF,SAAS,EACT46B,cAAc,EACd+G,cAAc,GAEhBC,GAAI,CACFxB,QAAS,GACTxlC,OAAQ,WACRoF,SAAS,EACT46B,cAAc,EACd+G,cAAc,GAEhBE,KAAM,CACJzB,QAAS,GACTxlC,OAAQ,aACRoF,SAAS,EACT46B,cAAc,EACd+G,cAAc,GAEhBt2B,KAAM,CACJ+0B,QAAS,GACTxlC,OAAQ,WACRggC,cAAc,EACd56B,SAAS,GAEXuL,MAAO,CACL60B,QAAS,GACTxlC,OAAQ,OACRknC,YAAa,qBACblH,cAAc,EACd56B,SAAS,GAEX+hC,IAAK,CACH3B,QAAS,GACTxlC,OAAQ,iBACRggC,cAAc,EACd56B,SAAS,IAGbx1B,KAAKw3D,kBACLx3D,KAAK61D,UAAY,CACfS,WAAW,EACXF,eAAe,EACfqB,SAAS,EACTC,GAAI,EACJ5xC,aAAc,GAEhB9lB,KAAK2U,OAAO3B,KAAKkV,iBAAiB,UAAWloB,KAAK23D,WACzCzvC,SAAAA,iBAAiB,UAAWloB,KAAK43D,iBAC3C,CAAA12D,IAAA,YAAAC,MAED,SAAW02D,GAAW,IAAAlwC,EAAA3nB,KACpB0F,OAAOC,KAAKkyD,GAAWjyD,SAAQ,SAAA1E,GACxB7B,EAAAA,OAAO6B,GAAO22D,EAAU32D,QAEhC,CAAAA,IAAA,iBAAAC,MAED,WACM,IAACnB,KAAKX,OAAOy4D,aACR,OAAA,EAET,IAAMC,EAAM/3D,KAAK2U,OAAO3B,KAAKu0B,wBACrB56B,EAAwBorD,EAAxBprD,OAAQ62B,EAAgBu0B,EAAhBv0B,IAAKw0B,EAAWD,EAAXC,OACfnrD,EAAIlO,OAAOqvC,YACZxK,QAAAA,EAAM,GAAKA,EAAM,EAAa,GAAT72B,GAAkBqrD,EAAS,GAAKA,EAASnrD,EAAa,GAATF,KAIxE,CAAAzL,IAAA,YAAAC,MAED,SAAWuU,EAAMuiD,GAAc,IAAArwC,EAAA5nB,KACzByc,GAAO,EAMJA,OALP/W,OAAOC,KAAK3F,KAAK+2D,YAAYnvD,KAAI,SAAA1G,GAC3B0mB,EAAKmvC,WAAW71D,IAAQwU,IAASkS,EAAKmvC,WAAW71D,GAAK00D,UAAYhuC,EAAKmvC,WAAW71D,GAAKs0B,UACzF/Y,GAAQw7C,GAAiBA,IAAiBrwC,EAAKmvC,WAAW71D,GAAKi2D,iBAG5D16C,IACR,CAAAvb,IAAA,aAAAC,MAED,SAAYqI,GACV,IAAQmL,EAAW3U,KAAX2U,OACJA,KAAAA,EAAO8Q,QAAU,GAAjB9Q,CAGJ,IAAMlG,EAAMvB,YAAYyH,EAAO8Q,OAAS,IAAKi4B,QAAQ,IAC/Cjb,EAAQ,CACZhd,OAAQ,CACNkd,KAAMhuB,EAAO8Q,OACbmd,GAAIn0B,IAGH+hB,KAAAA,eAAehnB,EAAO,gBAAiB,CAAEi5B,MAAAA,IAE5C9tB,EAAO8Q,OADLhX,GAAO,EACOA,EAEA,KAEnB,CAAAvN,IAAA,WAAAC,MAED,SAAUqI,GACR,IAAQmL,EAAW3U,KAAX2U,OACJA,KAAAA,EAAO8Q,QAAU,GAAjB9Q,CAGJ,IAAMlG,EAAMvB,YAAYyH,EAAO8Q,OAAS,IAAKi4B,QAAQ,IAC/Cjb,EAAQ,CACZhd,OAAQ,CACNkd,KAAMhuB,EAAO8Q,OACbmd,GAAIn0B,IAGH+hB,KAAAA,eAAehnB,EAAO,gBAAiB,CAAEi5B,MAAAA,IAE5C9tB,EAAO8Q,OADLhX,GAAO,EACOA,EAEA,KAEnB,CAAAvN,IAAA,OAAAC,MAED,SAAMqI,GACJ,IAAA0mB,EAAmFlwB,KAAK2U,OAAhFT,EAAWgc,EAAXhc,YAAawnC,EAAiBxrB,EAAjBwrB,kBAAmB7oC,EAAQqd,EAARrd,SAAU4oC,EAAcvrB,EAAdurB,eAAgBlX,EAAYrU,EAAZqU,aAC9D2zB,EAAQxc,GAAoB,EAAKA,EAAoBxnC,EACnD6R,EAAY01B,GAAkB5oC,EAC9BslD,EAAQ3uD,EAAM6sD,QAAUr2D,KAAKi3D,UAAY,EAAIppD,SAAS7N,KAAKi3D,SAAW,EAAG,IAAMj3D,KAAKi3D,SACtFiB,EAAQC,GAASpyC,EACnBmyC,GAAgBC,EAERpyC,EAAAA,EAEV,IAAMqyC,EAAYtiD,EAAKxB,uBAAuB4jD,EAAO3zB,GAC/C9B,EAAQ,CACZvuB,YAAa,CACXyuB,KAAMzuB,EACN0uB,GAAIw1B,IAGH5nC,KAAAA,eAAehnB,EAAO,OAAQ,CAAEi5B,MAAAA,IACrCziC,KAAK2U,OAAOT,YAAckkD,IAC3B,CAAAl3D,IAAA,WAAAC,MAED,SAAUqI,GACRg1C,IAAAA,EAAyDx+C,KAAK2U,OAAtDT,EAAWsqC,EAAXtqC,YAAawnC,EAAiB8C,EAAjB9C,kBAAmBnX,EAAYia,EAAZja,aAGpC6zB,GADU1c,GAAoB,EAAKA,EAAoBxnC,IAD7C1K,EAAM6sD,OAASxoD,SAAS7N,KAAKi3D,SAAW,EAAG,IAAMj3D,KAAKi3D,UAGhEmB,EAAY,IACFA,EAAA,GAGd,IAAM31B,EAAQ,CACZvuB,YAAa,CACXyuB,KAAMzuB,EACN0uB,GAJQ9sB,EAAAA,EAAKxB,uBAAuB8jD,EAAW7zB,KAO9C/T,KAAAA,eAAehnB,EAAO,OAAQ,CAAEi5B,MAAAA,IACrCziC,KAAK2U,OAAOT,YAAckkD,IAC3B,CAAAl3D,IAAA,qBAAAC,MAED,SAAoBqI,GAClB,IAAQqsD,EAA8B71D,KAA9B61D,UAAWx2D,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACI,IAA3BkhD,EAAU/vC,eACZ+vC,EAAU/vC,aAAenR,EAAOmR,aAChCnR,EAAOmR,aAAezmB,EAAOymB,gBAEhC,CAAA5kB,IAAA,YAAAC,MAED,SAAWqI,GACT,IAAQmL,EAAW3U,KAAX2U,OACHA,IAGA6b,KAAAA,eAAehnB,EAAO,qBACvBmL,EAAO0Q,OAET1Q,EAAO+U,OAEP/U,EAAO4U,WAEV,CAAAroB,IAAA,iBAAAC,MAED,SAAgBqI,GACd,IAAQmL,EAAW3U,KAAX2U,OACAsuB,EAA8BtuB,EAA9BsuB,WAAYG,EAAkBzuB,EAAlByuB,cAChBH,IACGzS,KAAAA,eAAe,QAAS,oBAAqB,CAChDkS,KAAM,aACNC,KAAMM,EACNL,IAAKK,IAEPtuB,EAAOw3B,kBAEL/I,IACG5S,KAAAA,eAAe,QAAS,wBAAyB,CACpDkS,KAAM,gBACNC,KAAMS,EACNR,IAAKQ,IAEPzuB,EAAO0uB,uBAEV,CAAAniC,IAAA,gBAAAC,MAgED,SAAewF,GACb,IAAQkvD,EAAc71D,KAAd61D,UACR,GAAIlvD,EAAE0vD,OAAQ,CACZR,EAAU4B,SAAU,EACdt6C,IAAAA,EAAKrZ,KAAKC,MACZoZ,GAAAA,EAAK04C,EAAU6B,GAAK,IACtB,OAEF7B,EAAU6B,GAAKv6C,EAEjBnd,KAAKq4D,cAAc1xD,EAAEivD,QAASjvD,EAAGkvD,EAAU4B,WAC5C,CAAAv2D,IAAA,cAAAC,MAED,SAAawF,GACX,IAAQkvD,EAAc71D,KAAd61D,UACJA,EAAU/vC,aAAe,IACtBnR,KAAAA,OAAOmR,aAAe+vC,EAAU/vC,aACrC+vC,EAAU/vC,aAAe,GAE3B+vC,EAAUS,WAAY,EACtBT,EAAU4B,SAAU,EACpB5B,EAAU6B,GAAK,IAChB,CAAAx2D,IAAA,gBAAAC,MAED,SAAem3D,EAAY9uD,EAAOiuD,GAEhC,IADA,IA/VqB9wD,EA+VfkI,EAAMnJ,OAAOC,KAAK3F,KAAK+2D,YACpBp1D,EAAI,EAAGA,EAAIkN,EAAIjP,OAAQ+B,IAAK,CACnC,IAAA42D,EAAgEv4D,KAAK+2D,WAAWloD,EAAIlN,IAA5EyuB,EAAMmoC,EAANnoC,OAAQwlC,EAAO2C,EAAP3C,QAASpgC,EAAO+iC,EAAP/iC,QAAS8hC,EAAWiB,EAAXjB,YAAalH,EAAYmI,EAAZnI,aAC/C,GAAIwF,IAAY0C,EAAY,CAC1B,KAAK9iC,GAAaiiC,GAAWrH,GAAe,CAC1C,IAAMoI,EAAWf,GAAoBH,GAAVlnC,EACJ,mBAAZooC,EACFhvD,EAAAA,EAAOxJ,KAAK2U,OAAQ8iD,GACC,iBAAZe,GACa,mBAAlBx4D,KAAKw4D,IACdx4D,KAAKw4D,GAAShvD,EAAOxJ,KAAK2U,OAAQ8iD,GAGjC18C,KAAAA,KAAKtB,GAAe8W,EAAA,CACvBrvB,IAAK2N,EAAIlN,GACTqI,OAAQR,EAAMQ,OACdytD,QAAAA,GACGz3D,KAAK+2D,WAAWloD,EAAIlN,OAhXVgF,EAmXF6C,GAlXnB0qC,iBACFvtC,EAAEqoD,aAAc,EAkXVxlD,EAAMkG,kBACN,UAGL,CAAAxO,IAAA,UAAAC,MAED,WACEnB,KAAK2U,OAAO3B,KAAKoV,oBAAoB,UAAWpoB,KAAK23D,WAC5CvvC,SAAAA,oBAAoB,UAAWpoB,KAAK43D,eAC7C53D,KAAK2U,OAAO3B,KAAKoV,oBAAoB,QAASpoB,KAAK62D,SAC1CzuC,SAAAA,oBAAoB,QAASpoB,KAAKy2D,eAC5C,CAAAv1D,IAAA,UAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,IACvB,CAAAt0B,IAAA,SAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,KACvB,CAAA,CAAAt0B,IAAA,aAAAK,IAvXD,WACS,MAAA,aAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACL01D,SAAU,GACVa,cAAc,EACdhC,oBAAoB,EACpBc,oBAAoB,EACpBL,iBAAiB,EACjBQ,WAAY,GACZvhC,SAAS,EACT1P,aAAc,EACdiwC,oBAAoB,OAEvBJ,GApBoBpmC,8SC1BjBkpC,YAAOl4B,GAAAtkB,EAAAw8C,EAAAl4B,GAAArkB,IAAAA,EAAAC,EAAAs8C,GAAA,SAAAA,IAAAv8C,OAAAlb,OAAAy3D,GAAAv8C,EAAA/b,MAAAH,KAAAL,WASV84D,OATUx3D,EAAAw3D,EAAA,CAAA,CAAAv3D,IAAA,gBAAAC,MAWX,WACS,MAAA,CACLu3D,YAAAA,MAEH,CAAAx3D,IAAA,cAAAC,MAED,WACEnB,KAAKiT,YAAY,mBAAoBjT,KAAK2zB,MAAM+kC,eACjD,CAAAx3D,IAAA,SAAAC,MAED,WACE,MAAA,iHAID,CAAA,CAAAD,IAAA,aAAAK,IAzBD,WACS,MAAA,YACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUD,UAEvBimC,GATmBzkC,ICAD2kC,YAAoB1kC,GAAAhY,EAAA08C,EAAA1kC,GAAA/X,IAAAA,EAAAC,EAAAw8C,GAAA,SAAAA,IAAAvyC,IAAAA,EAAAplB,OAAA23D,GAAA,IAAA,IAAAp4D,EAAAZ,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAS,GAAAR,EAAA,EAAAA,EAAAQ,EAAAR,IAAAoD,EAAApD,GAAAJ,UAAAI,GAsKtCqmB,OAtKsC6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,0BAyFnB,WAClBijB,EAAKwyC,iBACL,IAAA1oC,EAAsC9J,EAAKzR,OAAnCT,EAAWgc,EAAXhc,YAAaqwB,EAAYrU,EAAZqU,aACrB,GAAKne,EAAKyyC,gBAAgBt0B,GAA1B,CAGA,IAAMnjC,EAAQ0U,EAAKhC,eAAeI,EAAYqwB,GACxCrhC,EAAO4S,EAAK7B,qBAAqBC,EAAaqwB,EAAcnjC,GAClEglB,EAAKzR,OAAO+mC,kBAAoBx4C,EAC3B41D,EAAAA,YAAY13D,EAAOmjC,OACzBtc,EAAAuY,EAAApa,oBAEe,WACNme,IAAAA,EAAiBne,EAAKzR,OAAtB4vB,aACR,GAAKne,EAAKyyC,gBAAgBt0B,GAA1B,CAGA,IAAMrhC,EAAO4S,EAAK7B,qBAAqB,EAAGswB,GAC1Cne,EAAKzR,OAAO+mC,kBAAoBx4C,EAC3B41D,EAAAA,YAAY,EAAGv0B,GAChBne,EAAK2yC,OAAO13D,MAAQ,IACjBsT,EAAAA,OAAOT,YAAckS,EAAK2yC,OAAO13D,WAEzC4mB,EAAAuY,EAAApa,oBAEe,WACd,IAAAo4B,EAAsCp4B,EAAKzR,OAAnCT,EAAWsqC,EAAXtqC,YAAaqwB,EAAYia,EAAZja,aACrB,GAAKne,EAAKyyC,gBAAgBt0B,GAA1B,CAGA,IAAM7kC,EAAO6kC,EAAa3kC,OAC1BwmB,EAAK4yC,gBAAkB9kD,EACvB,IAAM9S,EAAQ0U,EAAKhC,eAAeI,EAAaqwB,GAC3CnjC,IAAUglB,EAAKmxB,UACZuhB,EAAAA,YAAY13D,EAAOmjC,GAE1B,IAAMwF,EAAUj0B,EAAK7B,qBAAqBC,EAAaqwB,EAAcnjC,GAKjE,GAHJglB,EAAKzR,OAAO+mC,kBAAoB3R,EAG3B3jB,EAAK2yC,OAAN,CAGJ,IAAAE,EAAuB7yC,EAAK2yC,OAApB13D,EAAK43D,EAAL53D,MAAOC,EAAG23D,EAAH33D,IACX4S,EAAc7S,EAChB+kB,EAAKzR,OAAOT,YAAc7S,EACjB6S,EAAc5S,GAAOF,GAAS1B,EAAO,GAC9C0mB,EAAKzR,OAAO4U,aAEftB,EAAAuY,EAAApa,iBAEY,WACX,IAAA8oC,EAAsC9oC,EAAKzR,OAAnCT,EAAWg7C,EAAXh7C,YAAaqwB,EAAY2qB,EAAZ3qB,aACrB,GAAKne,EAAKyyC,gBAAgBt0B,GAGtBrwB,GAAAA,EAAcqwB,EAAa,GAAGljC,MAC3BsT,EAAAA,OAAOT,YAAcqwB,EAAa,GAAGljC,cACjC6S,EAAcqwB,EAAaA,EAAa3kC,OAAS,GAAG0B,IAC7D8kB,EAAKzR,OAAOT,YAAcqwB,EAAaA,EAAa3kC,OAAS,GAAG0B,QAC3D,CACL,IAAM0S,EAAS8B,EAAKhC,eAAeI,EAAaqwB,GAChD,GAAIvwB,GAAU,EAAG,CACf,IAAMokD,EAAYhyC,EAAK8yC,YAAYhlD,EAAakS,EAAK4yC,gBAAiBhlD,EAAQuwB,GAC1E6zB,GAAa,IACfhyC,EAAKzR,OAAOT,YAAckkD,QAIjCnwC,EAAAuY,EAAApa,cAES,WACR,IAAA+yC,EAAsC/yC,EAAKzR,OAAnCT,EAAWilD,EAAXjlD,YAAaqwB,EAAY40B,EAAZ50B,aACjBne,EAAKyyC,gBAAgBt0B,IAAiBrwB,GAAeqwB,EAAaA,EAAa3kC,OAAS,GAAG0B,MACxFqT,EAAAA,OAAOT,YAAcqwB,EAAa,GAAGljC,UAE7C+kB,EA5JAuyC,OA4JA13D,EAAA03D,EAAA,CAAA,CAAAz3D,IAAA,cAAAC,MA1JD,WACEnB,KAAKu3C,UAAW,EAChBv3C,KAAK+4D,OAAS,KACd/4D,KAAKg5D,gBAAkB,EAEvBh5D,KAAK44D,iBAEAr9C,KAAAA,GAAG9B,EAAwBzZ,KAAKo5D,mBAChC79C,KAAAA,GAAG9B,EAAoBzZ,KAAKq5D,eAE5B99C,KAAAA,GAAG9B,EAAoBzZ,KAAK8jD,eAE5BvoC,KAAAA,GAAG9B,EAAgBzZ,KAAKujD,YAExBhoC,KAAAA,GAAG9B,EAAazZ,KAAKs5D,WAC3B,CAAAp4D,IAAA,YAAAC,MAED,SAAW02D,GAAW,IAAAnwC,EAAA1nB,KACpB,GAAK63D,EAAL,CAGMlyD,IAAAA,EAAOD,OAAOC,KAAKkyD,GACrBlyD,EAAK/F,OAAS,IAGbgG,EAAAA,SAAQ,SAAA1E,GACN7B,EAAAA,OAAO6B,GAAO22D,EAAU32D,MAE/BlB,KAAK44D,qBACN,CAAA13D,IAAA,iBAAAC,MAED,WACE,IAAAy/B,EAA8B5gC,KAAKX,OAA3Bm2B,EAAOoL,EAAPpL,QAASzhB,EAAQ6sB,EAAR7sB,SACTY,EAAW3U,KAAX2U,OACR,GAAI6gB,IAAYzhB,GAAgC,IAApBA,EAASnU,OACnC+U,EAAO4vB,aAAe,GACtB5vB,EAAO8mC,eAAiB,EACxB9mC,EAAO+mC,mBAAoB,MACtB,CACL,IAAM6d,EAAQv5D,KAAKw5D,mBAAmBzlD,EAAUY,EAAO9B,UACvD8B,EAAO4vB,aAAeg1B,EACf9d,EAAAA,eAAiB8d,EAAM35D,OAAS,EAAI25D,EAAMA,EAAM35D,OAAS,GAAGiT,SAAW,KAEjF,CAAA3R,IAAA,qBAAAC,MAED,SAAoBojC,EAAc1xB,GAChC,IAAM3D,EAAM,GACZ,OAAKq1B,GAIQj0B,EAAAA,MAAK,SAACnF,EAAEoF,GAAcpF,OAAAA,EAAE9J,MAAQkP,EAAElP,SAClCuE,EAAAA,SAAQ,SAACC,EAAMzE,GAC1B,IAAMq4D,EAAQ,GAGd,GAFAA,EAAMp4D,MAAQwE,EAAKxE,MAAQ,EAAI,EAAIwE,EAAKxE,MACxCo4D,EAAMn4D,IAAMuR,EAAW,GAAKhN,EAAKvE,IAAMuR,EAAWA,EAAWhN,EAAKvE,MAC9DuR,EAAW,GAAK4mD,EAAMp4D,MAAQwR,GAAlC,CAGA3D,EAAIvH,KAAK8xD,GACHC,IAAAA,EAAeD,EAAMn4D,IAAMm4D,EAAMp4D,MACvC,GAAc,IAAVD,EACFq4D,EAAMplD,OAASxO,EAAKxE,MACpBo4D,EAAMrlD,MAAQ,EACdqlD,EAAME,YAAcD,EACpBD,EAAM5mD,SAAW6mD,MACZ,CACCE,IAAAA,EAAO1qD,EAAI9N,EAAQ,GACzBq4D,EAAMplD,OAASulD,EAAKvlD,QAAUolD,EAAMp4D,MAAQu4D,EAAKt4D,KAC3C8S,EAAAA,MAAQwlD,EAAK/mD,SAAW+mD,EAAKxlD,MACnCqlD,EAAME,YAAcD,EACd7mD,EAAAA,SAAW+mD,EAAK/mD,SAAW6mD,OAG9BxqD,GA1BE,KA2BV,CAAAhO,IAAA,cAAAC,MAiFD,SAAa+S,EAAa8kD,EAAiB53D,EAAOmjC,GAChD,IAAI2zB,GAAQ,EACZ2B,EAAuBt1B,EAAanjC,GAA5BC,EAAKw4D,EAALx4D,MAAOC,EAAGu4D,EAAHv4D,IACX4S,GAAAA,GAAe7S,GAAS6S,GAAe5S,EAElC42D,OAAAA,EAET,IAAM1nD,EAAO0D,EAAc8kD,EAC3B,GAAIxoD,EAAO,GACL0D,EAAc7S,EAAO,CACvB,IAAMy4D,EAAQd,EAAkB33D,EAAQ23D,EAAkB33D,EAAQ,EAG3D62D,OAFC92D,EAAAA,EAAQ,GAAK,EAAImjC,EAAanjC,EAAQ,GAAGE,IAAMkP,EAAOspD,EAAQ,EAKnE,OAAA,IACR,CAAA54D,IAAA,kBAAAC,MAED,SAAiB4S,GACf,SAAUA,GAAYA,EAASnU,OAAS,KACzC,CAAAsB,IAAA,cAAAC,MAED,SAAaC,EAAOmjC,GAClBvkC,KAAKu3C,SAAWn2C,EACZA,GAAS,GAAKmjC,EAAa3kC,OAAS,EACtCI,KAAK+4D,OAASx0B,EAAanjC,GAE3BpB,KAAK+4D,OAAS,QAEjB,CAAA,CAAA73D,IAAA,aAAAK,IArMD,WACS,MAAA,yBACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLi0B,SAAS,EACTzhB,SAAU,QAEb4kD,GAV+CppC,4pDCG7BwqC,YAAMnmB,GAAA33B,EAAA89C,EAAAnmB,GAAA13B,IAAAA,EAAAC,EAAA49C,GAgBzB,SAAAA,EAAa52D,GAAMijB,IAAAA,EAE0BA,OAF1BplB,OAAA+4D,IACjB79C,EAAAA,EAAAzV,UAAMtD,IACDkhC,UAAYje,EAAK/mB,OAAOglC,WAAa,EAACje,EAJ5C2zC,OAKA94D,EAAA84D,EAAA,CAAA,CAAA74D,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACT,IAAAA,KAAKX,OAAOm2B,QAAZ,CAGJzK,EAAAA,EAAAgvC,EAAAxzD,+BAAAE,KAAAzG,MACAA,KAAKiT,YAAY,iBAAkBjT,KAAK2zB,MAAMtgB,QAC9CrT,KAAKg6D,WAAah6D,KAAKg6D,WAAW/tD,KAAKjM,MACvCA,KAAKi6D,gBAAkB,EACvBj6D,KAAKiM,KAAK,iBAAkB,CAAC,QAAS,YAAajM,KAAKg6D,YAEnDz+C,KAAAA,GAAG9B,IAAqB,WACvBiO,EAAK2c,WAAa3c,EAAKroB,OAAO66D,aAC3Bz2D,EAAAA,WAAWikB,GAAM,WACpBA,EAAKyyC,gBAAgBzyC,EAAK2c,UAAW3c,EAAKroB,OAAO66D,eAChD,QAIDlnD,IAAAA,EAAOhT,KAAK2U,OAAO3B,KACzBhT,KAAKo6D,UAAYpnD,EAAKhG,MAAMN,OAASsG,EAAKw8B,aAAex8B,EAAKqnD,YAC9Dr6D,KAAKs6D,WAAatnD,EAAKhG,MAAML,QAAUqG,EAAKy8B,cAAgBz8B,EAAKunD,aAE7Dv6D,KAAKqkC,WACPrkC,KAAKm6D,gBAAgBn6D,KAAKqkC,UAAWrkC,KAAKX,OAAO66D,gBAEpD,CAAAh5D,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAgvC,EAAAxzD,2BAAAE,KAAAzG,MACAA,KAAKshC,OAAO,iBAAkB,CAAC,QAAS,YAAathC,KAAKg6D,cAC3D,CAAA94D,IAAA,aAAAC,MAED,SAAYwF,GACJ5C,IAAAA,EAAMD,KAAKC,MACbA,EAAM/D,KAAKi6D,gBAAkB,MAGjCj6D,KAAKi6D,gBAAkBl2D,EACvB4C,EAAEutC,iBACFvtC,EAAE+I,kBACG8gB,KAAAA,eAAe7pB,EAAG,UACvB3G,KAAKqT,OAAOrT,KAAKX,OAAOm7D,UAAWx6D,KAAKX,OAAO66D,YAAa,MAC7D,CAAAh5D,IAAA,kBAAAC,MAED,SAAiBkjC,EAAW61B,GAI1B,GAHK71B,IACSA,EAAA,GAEV61B,EACFl6D,KAAK2U,OAAO8lD,eAAiBp2B,MAD/B,CAIA,IAAQ1vB,EAAkC3U,KAAlC2U,OAAQylD,EAA0Bp6D,KAA1Bo6D,UAAWE,EAAet6D,KAAfs6D,WACnBtnD,EAAyB2B,EAAzB3B,KAAMsyB,EAAmB3wB,EAAnB2wB,eACR1zB,EAAQ+C,EAAO9C,MACfnF,EAAQsG,EAAKw8B,YACb7iC,EAAS24B,GAAkB40B,EAAc50B,EAAemK,aAAez8B,EAAKy8B,aAC9EE,EAASyqB,EACT1qB,EAAU4qB,EACVxpD,EAAI,EACJC,EAAI,EACU,MAAdszB,GAAoC,MAAdA,IAClBjkC,EAAAA,GAAAA,OAAMuM,EAAU,MACfvM,EAAAA,GAAAA,OAAMsM,EAAS,MAClBoE,IAAEnE,EAASD,GAAS,EACpBqE,IAAErE,EAAQC,GAAU,GAE1B,IAAM+tD,EAAU,aAAAt6D,OAAgB0Q,EAAC,OAAA1Q,OAAM2Q,EAAC,eAAA3Q,OAAcikC,EAAgB,SAChEs2B,EAAU,CACdC,gBAAiB,gBACjB7qB,UAAW2qB,EACXjQ,gBAAiBiQ,EACjB/tD,OAAQ+iC,EACRhjC,MAAOijC,GAGHtlC,EAAU6vD,EAActoD,EAAQoB,EAChCsqB,EAAS48B,EAAcvlD,EAAO+b,UAAU,UAAY,KAC1DhrB,OAAOC,KAAKg1D,GAAS/yD,KAAI,SAAA1G,GACf8L,EAAAA,MAAM9L,GAAOy5D,EAAQz5D,GAC7Bo8B,GAAUA,EAAOtqB,OAASsqB,EAAOtqB,KAAKhG,MAAM9L,GAAOy5D,EAAQz5D,UAE9D,CAAAA,IAAA,SAAAC,MAED,WAAQq5D,IAAAA,EAAS76D,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GAAUu6D,IAAWv6D,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GAASk7D,EAAKl7D,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAC/CgV,EAAS3U,KAAK2U,OACf3U,KAAKqkC,YACRrkC,KAAKqkC,UAAY,GAEby2B,IAAAA,EAASN,EAAY,GAAI,EAE/Bx6D,KAAKqkC,WAAarkC,KAAKqkC,UAAY,EAAa,IAATy2B,EAAgBD,GAAS,EAC3DV,KAAAA,gBAAgBn6D,KAAKqkC,UAAW61B,GACrCvlD,EAAOoG,KAAKtB,GAAgC,IAAjBzZ,KAAKqkC,aACjC,CAAAnjC,IAAA,gBAAAC,MAED,WACS,MAAA,CACLkS,OAAQ0nD,MAEX,CAAA75D,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,mGAAAp1B,OAII+xB,GAAWnyB,KAAM,cAAeA,KAAK4vB,aAAagQ,YAAW,uBAElE,CAAA,CAAA1+B,IAAA,aAAAK,IApID,WACS,MAAA,WACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACP84D,aAAa,EACbM,WAAW,EACXn2B,UAAW,EACX7O,SAAS,OAEZukC,GAdiCrlB,+1DCQ9BsmB,GACC,qBADDA,GAEI,SAFJA,GAGQ,aAGRn7C,YAAG+zB,GAAA33B,EAAA4D,EAAA+zB,GAAA13B,IAAAA,EAAAC,EAAA0D,GAAA,SAAAA,IAAAuG,IAAAA,EAAAplB,OAAA6e,GAAA,IAAA,IAAAngB,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAwHNqmB,OAxHM6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KA0GK,aAAA,SAACwD,GACP,IAACyf,EAAK60C,iBACD,OAAA,EAEPvrD,EAAAA,iBAAmB/I,EAAE+I,kBACnB0W,EAAK80C,OACP90C,EAAK+0C,UACA3qC,EAAAA,eAAe7pB,EAAG,aAAc,CAAE87B,MAAO,MAAOE,MAAM,EAAMC,IAAI,IAChE5N,EAAAA,QAAQ,aAAc,WACe,IAAjC5O,EAAKzR,OAAO9C,MAAM0D,aAC3B6Q,EAAKg1C,aACA5qC,EAAAA,eAAe7pB,EAAG,aAAc,CAAE87B,MAAO,MAAOE,MAAM,EAAOC,IAAI,IACjE5N,EAAAA,QAAQ,aAAc,WAE9B5O,EApGAvG,OAoGA5e,EAAA4e,EAAA,CAAA,CAAA3e,IAAA,eAAAC,MAlGD,SAAcgC,GAC0B,kBAA3BA,EAAKwR,OAAOtV,OAAO6/B,MAC5B/7B,EAAK9D,OAAOg8D,SAAWl4D,EAAKwR,OAAOtV,OAAO6/B,OAE7C,CAAAh+B,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KAERA,KAAKi7D,mBAGVlwC,EAAAA,EAAAlL,EAAAtZ,+BAAAE,KAAAzG,MACAA,KAAKs7D,MAAQN,GACbh7D,KAAKu7D,gBAEDv7D,KAAKX,OAAOg8D,UACdr7D,KAAK6zC,YAGFl6B,KAAAA,KAAKF,IAAiB,WACrBiO,EAAKroB,OAAOg8D,WACdvlD,EAAK3O,YAAYugB,EAAK+N,KAAK,kBAAmB,mBACzCxpB,EAAAA,KAAK,QAASyb,EAAK8zC,kBAG7B,CAAAt6D,IAAA,gBAAAC,MAED,WACS,MAAA,CACLs6D,QAAS,CAAEroC,KAAMsoC,GAAS7nC,MAAO,cACjC8nC,YAAa,CAAEvoC,KAAMwoC,GAAa/nC,MAAO,kBAE5C,CAAA3yB,IAAA,YAAAC,MAED,WACE,IAAQwyB,EAAU3zB,KAAV2zB,MACH1gB,KAAAA,YAAY,iBAAkB0gB,EAAM8nC,SACpCxoD,KAAAA,YAAY,iBAAkB0gB,EAAMgoC,eAC1C,CAAAz6D,IAAA,gBAAAC,MAED,WAAiB,IAAAwmB,EAAA3nB,KACP2U,EAAW3U,KAAX2U,OACR3U,KAAK67D,iBAAmB,WAEtB,IAAMx2C,EAAS1Q,EAAO0Q,OACjB5hB,EAAAA,WAAWkkB,GAAM,YAEnBtC,GAAU1Q,EAAOwtB,cACjB,IACF9c,GAAU1Q,EAAOwtB,YACbnN,EAAAA,QAAQ,aAAc,UAC3BrN,EAAKm0C,UAAY,KACV/gD,EAAAA,KAAKtB,IAAmB,IAG5BsiD,KAAAA,iBAAmB,SAACp1D,GAChBoU,EAAAA,KAAKtB,IAAmB,GAC3B9S,MAAAA,GAAAA,EAAGq1D,yBACLr0C,EAAKm0C,UAAYn1D,EAAEq1D,wBAEhBhnC,EAAAA,QAAQ,aAAc,QAGxBinC,KAAAA,gCAAkC,SAACt1D,GAChC8vB,IAAAA,EAAO9hB,EAAO9C,MAAMqqD,uBAEtBv0C,EAAK2zC,QAAUN,IAA+BvkC,IAASukC,IAClDt3B,EAAAA,mBAAmB,MAAM,GAElC/b,EAAK2zC,MAAQ7kC,EACTA,IAASukC,GACXrzC,EAAKo0C,iBAAiBp1D,GACb8vB,IAASukC,IAClBrzC,EAAKk0C,iBAAiBl1D,IAItBgO,EAAO9C,QACT8C,EAAO9C,MAAMqW,iBAAiB,wBAAyBloB,KAAK+7D,kBAC5DpnD,EAAO9C,MAAMqW,iBAAiB,wBAAyBloB,KAAK67D,kBAC5Dh8C,EAAIs8C,+BAA+BxnD,EAAO9C,QAAU8C,EAAO9C,MAAMqW,iBAAiB,gCAAiCloB,KAAKi8D,oCAE3H,CAAA/6D,IAAA,yBAAAC,MAkBD,SAAwBi7D,GACtB,IAAMC,EAActxD,EAAIzF,SAASg3D,aAC9B10D,KAAI,SAACoF,GACA,IACF,OAAOjC,EAAIiC,EAAMuvD,UAAU30D,KAAI,SAAC40D,GAAI,OAAKA,EAAKxtD,WAASnH,KAAK,UACrDlB,GACD81D,IAAAA,EAAOn3D,SAASC,cAAc,QACpCk3D,EAAKC,IAAM,aACXD,EAAK36D,KAAOkL,EAAMlL,KAClB26D,EAAK5qD,MAAQ7E,EAAM6E,MACnB4qD,EAAK59D,KAAOmO,EAAMnO,KACXyG,EAAAA,SAASq3D,KAAK1pD,YAAYwpD,GAE5B,MAAA,MAERz6C,OAAOkxB,SACPrrC,KAAK,MACFmF,EAAQ1H,SAASC,cAAc,SAErCyH,EAAMqvD,YAAcA,EACb/2D,EAAAA,SAASq3D,KAAK1pD,YAAYjG,KAGnC,CAAA9L,IAAA,aAAAC,MAGA,WAAc,IAAAymB,EAAA5nB,KACJ2U,EAAiC3U,KAAjC2U,OAAQib,EAAyB5vB,KAAzB4vB,aAAcvwB,EAAWW,KAAXX,OAC9B,GAAKW,KAAKi7D,mBAAoBj7D,KAAKk7D,MAG/B,IACF,IAAQ59B,EAAW1N,EAAX0N,OAKR,GAJIA,IACKzrB,EAAAA,MAAMyrB,OAAiC,WAAxBxnB,EAAKpO,OAAO41B,GAAuBA,EAASA,EAAOA,QAGvEj+B,EAAOu9D,gBAAkB58D,KAAK68D,oBAAqB,CACrD,IAAMC,EAAa,GAEfz9D,GAAAA,EAAOqN,OAASrN,EAAOsN,OACzBmwD,EAAWpwD,MAAQrN,EAAOqN,MAC1BowD,EAAWnwD,OAAStN,EAAOsN,WACtB,CACCowD,IAAAA,EAAapoD,EAAO3B,KAAKu0B,wBAC/Bu1B,EAAWpwD,MAAQqwD,EAAWrwD,MAC9BowD,EAAWnwD,OAASowD,EAAWpwD,OAGjCqwD,yBAAyBC,cAAcH,GAAYvvC,MAAK,SAAC6uC,GACvD,IAAQc,EAA4B79D,EAA5B69D,WAAYC,EAAgB99D,EAAhB89D,YAEpBv1C,EAAKm0C,mBAGCqB,IAAAA,EAAUF,GAAcvoD,EAAO3B,KAC/B2e,EAAayrC,EAAQC,cACrBC,EAAkBF,EAAQE,gBAC1BC,EAAcH,EAAQG,YAE5B31C,EAAK41C,uBAAuBpB,GAGtB7oD,IAAAA,EAASjO,SAASC,cAAc,SAEtC,GADAgO,EAAOkqD,OAAO,8BACVN,EAAa,CACf,IAAIO,EAAa,GACU,iBAAhBP,EACIA,EAAAA,EACmB,mBAAhBA,IACHA,EAAAA,EAAY12D,KAAKpH,IAE5Bq+D,GACFnqD,EAAOkqD,OAAOC,QAEPN,IAAYzoD,EAAO3B,MAC5BO,EAAOkqD,OAAM,2FAIRn4D,EAAAA,SAASq3D,KAAKc,OAAOlqD,GAGrBjO,EAAAA,SAASwK,KAAK2tD,OAAOL,GAGrBl1C,EAAAA,iBAAiB,YAAY,SAAC1e,GAAU,IAAAm0D,EAAAC,EAAAC,EAC/B,QAAdF,EAAAhpD,EAAO+Z,eAAO,IAAAivC,GAAU,QAAVC,EAAdD,EAAgBpK,gBAAQ,IAAAqK,GAAgB,QAAhBC,EAAxBD,EAA0BE,sBAAc,IAAAD,GAAxCA,EAAAp3D,KAAAm3D,GAEIjsC,IACE4rC,EACS5mC,EAAAA,aAAaymC,EAASG,GACxBD,EACE3mC,EAAAA,aAAaymC,EAASE,EAAgBC,aAEjD5rC,EAAW1e,YAAYmqD,IAM3Bx1C,EAAKi0C,qBACJ,CAAEliD,MAAM,YAEJkG,EAAIs8C,+BAA+BxnD,EAAO9C,OAC5CA,EAAAA,MAAMksD,0BAA0B,sBAEvCppD,EAAO9C,MAAMmsD,0BAIR,OAAA,QACAC,GAEA,OADCh/D,QAAAA,MAAM,aAAcg/D,IACrB,KAIX,CAAA/8D,IAAA,UAAAC,MAGA,WACE,IAAQwT,EAAW3U,KAAX2U,OACJ,IACuCupD,IAAAA,EAAzC,GAAIl+D,KAAKi7D,kBAAoBj7D,KAAKk7D,MAC5Bl7D,KAAK68D,6BAAmBqB,EAAIlB,gCAAwB,IAAAkB,GAAxBA,EAA0Bv/D,OACxDq+D,yBAAyBr+D,OAAO+tB,QACvB7M,EAAIs8C,+BAA+BxnD,EAAO9C,OAC5CA,EAAAA,MAAMksD,0BAA0B,UAEvCz4D,SAAS64D,uBAGN,OAAA,QACAF,GAEA,OADCh/D,QAAAA,MAAM,UAAWg/D,IAClB,KAIX,CAAA/8D,IAAA,QAAAK,IAGA,WAAa68D,IAAAA,EACHzpD,EAAW3U,KAAX2U,OAEN,SAAG3U,KAAK68D,qBAA+CuB,QAA5BA,EAAIpB,oCAAwBoB,IAAxBA,EAA0Bz/D,SACxD2G,SAAS+4D,yBACR/4D,SAAS+4D,0BAA4B1pD,EAAO9C,OAC9C8C,EAAO9C,MAAMqqD,yBAA2BlB,KAE3C,CAAA95D,IAAA,iBAAAC,MAED,WACQyQ,IAAAA,EAAQ5R,KAAK2U,OAAO9C,MAE1B,MADqE,YAAlDiE,EAAKpO,OAAOpC,SAASg5D,0BAAyCh5D,SAASg5D,0BAEzC,YAA/CxoD,EAAKpO,OAAOkK,EAAM2sD,2BAA2C3sD,EAAM2sD,yBACnE3sD,EAAM4sD,gCAAmF,aAAjD1oD,EAAKpO,OAAOkK,EAAMmsD,6BAC3D/9D,KAAK68D,sBACP,CAAA37D,IAAA,oBAAAC,MAED,WACE,MAAO,6BAA8BxC,QAAU,gBAAgB+O,KAAK9O,SAAS6/D,YAC9E,CAAAv9D,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAlL,EAAAtZ,2BAAAE,KAAAzG,MACA,IAAQ2U,EAAW3U,KAAX2U,OACRA,EAAO9C,MAAMuW,oBAAoB,wBAAyBpoB,KAAK+7D,kBAC/DpnD,EAAO9C,MAAMuW,oBAAoB,wBAAyBpoB,KAAK67D,kBAC/Dh8C,EAAIs8C,+BAA+BxnD,EAAO9C,QAAU8C,EAAO9C,MAAMuW,oBAAoB,gCAAiCpoB,KAAKi8D,iCAC3Hj8D,KAAKm7D,UACA75B,KAAAA,OAAO,QAASthC,KAAKg0C,YAC3B,CAAA9yC,IAAA,SAAAC,MAED,WACE,GAAKnB,KAAKX,OAAOg8D,UAAar7D,KAAKi7D,iBAGnC,MAAA,0GAAA76D,OAGI+xB,GAAWnyB,KAAM,MAAOA,KAAK4vB,aAAagQ,YAAW,uBAE1D,CAAA,CAAA1+B,IAAA,aAAAK,IAlTD,WACS,MAAA,QACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPi6D,UAAU,EACVuB,gBAAgB,EAChBlwD,WAAOrJ,EACPsJ,YAAQtJ,EACR65D,gBAAY75D,EACZ85D,iBAAa95D,KAEhB,CAAAnC,IAAA,iCAAAC,MAED,SAAuCyQ,GAC9B,MAA2C,mBAApCA,EAAMmsD,8BACrBl+C,GApBe60B,gSCbGgqB,YAAYn+B,GAAAtkB,EAAAyiD,EAAAn+B,GAAArkB,IAAAA,EAAAC,EAAAuiD,GAc/B,SAAAA,EAAav8D,GAASikB,IAAAA,EAEPA,OAFOplB,OAAA09D,GACNz2C,EAAAuY,EAAdtkB,EAAAA,EAAAzV,UAAMtE,IAyBG,YAAA,SAACwE,GACV,IAAQgO,EAAR6rB,EAAApa,GAAQzR,OACRhO,EAAEutC,iBACFvtC,EAAE+I,kBACE0W,EAAKu4C,IAAM,EAAIv4C,EAAK/mB,OAAOu/D,QAAQh/D,QAChC++D,EAAAA,MACLv4C,EAAKy4C,YAAYz4C,EAAK/mB,OAAOu/D,QAAQx4C,EAAKu4C,KAAMv4C,EAAKu4C,KACrDhqD,EAAOoG,KAAKtB,GAAiB2M,EAAKu4C,IAAM,KAExCv4C,EAAKy4C,cACLlqD,EAAOoG,KAAKtB,QAlCd2M,EAAKu4C,KAAM,EAAEv4C,EAJds4C,OAKAz9D,EAAAy9D,EAAA,CAAA,CAAAx9D,IAAA,cAAAC,MAED,WACOnB,KAAKX,OAAOu/D,SAA0C,IAA/B5+D,KAAKX,OAAOu/D,QAAQh/D,SAGhDI,KAAKiT,YAAY,iBAAkBjT,KAAK2zB,MAAMmrC,UAC9C9+D,KAAKwuD,gBACN,CAAAttD,IAAA,gBAAAC,MAED,WACS,MAAA,CACL29D,SAAUC,MAEb,CAAA79D,IAAA,aAAAC,MAED,WACEnB,KAAK6+D,YAAc7+D,KAAKwtB,KAAK,YAAaxtB,KAAKg/D,WAC/C,IAAMx1D,EAA2B,WAAnB2d,GAAQhG,OAAsB,WAAa,QACpDlV,KAAAA,KAAKzC,EAAOxJ,KAAK8+D,UACtB9+D,KAAKuO,SACN,CAAArN,IAAA,YAAAC,MAgBD,SAAW8J,GACT,IAAQ0J,EAAW3U,KAAX2U,OACH1J,IAGL0J,EAAO4U,QACP5U,EAAOT,YAAc,EACjBS,EAAOu2B,UACTv2B,EAAOu2B,UAAUjgC,GAEjB0J,EAAOhK,IAAMM,EAEf0J,EAAOtV,OAAO4L,IAAMA,EACpB0J,EAAO+U,UACR,CAAAxoB,IAAA,UAAAC,MAED,WACEnB,KAAKshC,OAAO,CAAC,WAAY,SAAUthC,KAAK8+D,YACzC,CAAA59D,IAAA,SAAAC,MAED,WACM,GAACnB,KAAKX,OAAOu/D,SAA0C,IAA/B5+D,KAAKX,OAAOu/D,QAAQh/D,OAGhD,MAAA,sGAAAQ,OAII+xB,GAAWnyB,KAAM,gBAAiBA,KAAK4vB,aAAagQ,YAAW,8BAGpE,CAAA,CAAA1+B,IAAA,aAAAK,IApFD,WACS,MAAA,aACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUI,cACpBzxB,MAAO,EACP6J,IAAK,KACL2zD,QAAS,QAEZF,GAZuC1qC,2lDCgB1C,IAAMirC,GAAiB,CACrBC,SAAU,2BACVv1B,SAAU,WACVzrB,QAAS,KAMLihD,GAIQ,WACV,MAAuB,oBAATC,MALZD,GAWa,WACR,MAAe,oBAARE,KAAuBA,IAAIC,iBAZvCH,GAkBI,WACN,MAA2B,WAApBh4C,GAAQ7F,SAnBb69C,GAyBc,WAChB,OAAO59C,UAAUg+C,YAefC,GAIK,SAAEh3D,GACF,MAAA,iCAAiCkF,KAAKlF,IAL3Cg3D,GAWS,SAAEC,GAQb,IAPMC,IAAAA,EAAQD,EAAQx4D,MAAM,SACtBnF,EAAO49D,EAAM,GAGbC,GADkC,WAAxBD,EADKD,EAAQ3gE,QAAQ,WAAa,EAAI,EAAI,GACP8gE,KAAOC,oBAClCH,EAAMI,OACxBC,EAAQ,IAAIC,WAAWL,EAAQ//D,QAE5B+B,EAAI,EAAGA,EAAIg+D,EAAQ//D,OAAQ+B,IAC5BA,EAAAA,GAAKg+D,EAAQM,WAAWt+D,GAOhC,OAAO,IAHiBhD,OAAOygE,MAAQzgE,OAAOuhE,SAAWvhE,OAAOwhE,YAAc,SAAUT,EAAOU,GACtFV,OAAAA,IAEkB,CAACK,GAAQ,CAAEj+D,KAAAA,KA3BpC09D,GAiCO,SAAEh3D,GACJ,MAAA,gBAAgBkF,KAAKlF,IAlC1Bg3D,GAwCc,SAAEh3D,GAElB,IADA,IAAMqG,EAAM,IAAImxD,WAAWx3D,EAAI5I,QACtB+B,EAAI,EAAGA,EAAI6G,EAAI5I,OAAQ+B,IAC1BA,EAAAA,GAAK6G,EAAIy3D,WAAWt+D,GAEnBkN,OAAAA,GAOLwxD,GAAgB,CAIpBC,mBAAkBA,SAAEr1D,EAAK0+B,GACjB42B,IAAAA,EAASj7D,SAASC,cAAc,KACtCg7D,EAAO1hE,KAAOoM,EACPnF,EAAAA,aAAa,WAAY6jC,GAChC42B,EAAO/6D,UAAY,mBACnB+6D,EAAO96D,UAAY,iBACnB86D,EAAOvzD,MAAMsB,QAAU,OAoBhB,OAbA4Z,EAAAA,iBAAiB,SAJH,SAAf09B,EAAyBj/C,GAC7BA,EAAE+I,kBACG0Y,KAAAA,oBAAoB,QAASw9B,MAI3B91C,SAAAA,KAAKmD,YAAYstD,GAE1B98D,YAAW,WACT88D,EAAOpN,QACErjD,SAAAA,KAAK+Y,YAAY03C,GAEtBt1D,EAAIu1D,WAAW,UACjB/8D,YAAW,WAAM47D,OAAAA,IAAIoB,gBAAgBx1D,KAAM,OAE5C,KAEI,GAMTy1D,mBAAkBA,SAAEz1D,EAAK0+B,GAEvB,GAAI1+B,aAAem0D,KAAM,CACjBuB,IAAAA,EAAS,IAAIC,WAMZ,OALAtxD,EAAAA,OAAS,SAAU3I,GAClB84D,IAAAA,EAAU94D,EAAEqD,OAAOzH,OACXm+D,GAAAA,mBAAmBjB,EAAS91B,IAE5Cg3B,EAAOE,cAAc51D,IACd,GAGLu0D,GAAuBv0D,KACzBA,EAAM,QAAUA,EAAIjE,QAAQ,sBAAuBi4D,GAAeC,WAG/DvgE,OAAOstB,KAAKhhB,KACG61D,QAChB,oGAGAliE,SAASC,KAAOoM,GAIb,OAAA,GAMT81D,mBAAkBA,SAAE91D,EAAK0+B,GAEvB,GAAI1+B,aAAem0D,KAAM,CACjBuB,IAAAA,EAAS,IAAIC,WAMZ,OALAtxD,EAAAA,OAAS,SAAU3I,GAClB84D,IAAAA,EAAU94D,EAAEqD,OAAOzH,OACXw+D,GAAAA,mBAAmBtB,EAAS91B,IAE5Cg3B,EAAOE,cAAc51D,IACd,EAGH+1D,IAAAA,EAAS17D,SAASC,cAAc,UAU/B,OATEuK,SAAAA,KAAKmD,YAAY+tD,GAEtBxB,GAAuBv0D,KACzBA,EAAM,QAAUA,EAAIjE,QAAQ,sBAAuBi4D,GAAeC,WAGpE8B,EAAOr2D,IAAMM,EACbxH,YAAW,WAAM6B,OAAAA,SAASwK,KAAK+Y,YAAYm4C,KAAS,MAE7C,IAOLC,GAAe,CAInBC,cAAa,SAAEj2D,GAAK9I,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACtBwhE,EAAM,IAAIC,eAYTD,OATHh/D,EAAQ+b,UACVijD,EAAIjjD,QAAU/b,EAAQ+b,SAIe,kBAA5B/b,EAAQk/D,kBACjBF,EAAIE,gBAAkBl/D,EAAQk/D,iBAGzBF,GAMTG,WAAU,SAAEH,GAAKI,IAAAA,EAAO5hE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACzB+F,OAAOsxB,QAAQuqC,GAAS37D,SAAQ,SAAA4oC,GAAkBS,IAAAA,EAAAuyB,EAAAhzB,EAAA,GAAhBttC,EAAG+tC,EAAA,GAAE9tC,EAAK8tC,EAAA,GACtCwyB,EAAAA,iBAAiBvgE,EAAKC,OAO9BugE,gBAAeA,SAAEz2D,EAAK0+B,GAAUxnC,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACxC,OAAO,IAAIukB,SAAQ,SAACC,EAASiV,GAC3B,IAAM+nC,EAAMF,GAAaC,cAAcj2D,EAAK9I,GAExC8pB,EAAAA,KAAK,MAAOhhB,GAAK,GACrBk2D,EAAIQ,aAAe,OAGfx/D,EAAQo/D,SACGD,GAAAA,WAAWH,EAAKh/D,EAAQo/D,SAGnCp/D,EAAQk/D,kBACVF,EAAIE,iBAAkB,GAGpB/xD,EAAAA,OAAS,SAAU3I,GACG,MAApBA,EAAEqD,OAAOygC,QACXm3B,GAAOj7D,EAAEqD,OAAO63D,SAAUl4B,EAAUxnC,EAAQ+8D,UAAYD,GAAeC,UAC/Dv4D,EAAAA,EAAEqD,OAAO63D,WAEjBzoC,EAAO,IAAItE,MAAK,QAAA10B,OAASuG,EAAEqD,OAAOygC,OAAMrqC,MAAAA,OAAKuG,EAAEqD,OAAO83D,eAI1DX,EAAI5xD,QAAU,WACL6pB,EAAA,IAAItE,MAAM,4BAGnBqsC,EAAIY,UAAY,WACP3oC,EAAA,IAAItE,MAAM,qBAGf3yB,EAAQ6/D,eACV7/D,EAAQ6/D,cAAcb,GAIxB19D,YAAW,WAAA,OAAM09D,EAAIc,SAAQ,QAYnBL,SAAAA,GAAQh3C,EAAMs3C,EAAmBhD,GAE/C,IA4DIiD,EA5DAhgE,EAAU,GACVwnC,EAAWs1B,GAAet1B,SAC1By4B,EAAiBnD,GAAeC,SAchCv2D,GAZ6B,iBAAtBu5D,GAETv4B,EAAWu4B,GAAqBjD,GAAet1B,SAC/Cy4B,EAAiBlD,GAAYD,GAAeC,UACN,WAA7Bn9D,EAAOmgE,IAAwD,OAAtBA,IAElD//D,EAAOouB,EAAAA,KAAQ0uC,IAAmBiD,GACvB//D,EAAAA,EAAQwnC,UAAYs1B,GAAet1B,SAC7BxnC,EAAAA,EAAQ+8D,UAAYD,GAAeC,UAIjC,SAAjBv2D,OAAO3I,MAAkB,CAC3B,IAAMqiE,EAAOz3C,EACNs3C,EAAAA,EACaG,EAAAA,EACpBD,EAAiBlD,GAAYD,GAAeC,SAI1C,GAAgB,iBAATt0C,IAAsBs3C,IAAsBhD,GAAYt0C,EAAKhrB,OAAS,KAAM,CACrF,IAAMqL,EAAM2f,EACN03C,EAAoBr3D,EAAIhE,MAAM,KAAK64D,MAAM74D,MAAM,KAAK,GAC1D0iC,EAAW24B,GAAqBrD,GAAet1B,SAGzC42B,IAAAA,EAASj7D,SAASC,cAAc,KAEtC,GADAg7D,EAAO1hE,KAAOoM,GACuB,IAAjCs1D,EAAO1hE,KAAKC,QAAQmM,GACtB,OAAOg2D,GAAaS,gBAAgBz2D,EAAK0+B,EAAUxnC,GAKnDq9D,GAAAA,GAAuB50C,GAAO,CAChC,GAAIA,EAAKhrB,OAAS,aAAuBu/D,KAA6B,CAC9DgD,IAAAA,EAAO3C,GAA2B50C,GAEjCg3C,OADPQ,EAAiBD,EAAKrgE,MAAQsgE,EACvBR,GAAOO,EAAMx4B,EAAUy4B,GAE9B,OAAOjD,KACH59C,UAAUg+C,WAAWC,GAA2B50C,GAAO+e,GACvD02B,GAAcC,mBAAmB11C,EAAM+e,GAK/C,GAAoB,iBAAT/e,GAAqB40C,GAAyB50C,GAAO,CACxD23C,IAAAA,EAAa/C,GAAgC50C,GAInDA,EAAO,IAHiBjsB,OAAOygE,MAAQzgE,OAAOuhE,SAAWvhE,OAAOwhE,YAAc,SAAUT,EAAOU,GACtFV,OAAAA,IAEkB,CAAC6C,GAAa,CAAEzgE,KAAMsgE,IAK/Cx3C,aAAgBw0C,KACXx0C,EAAAA,EAMPu3C,EAAO,IAHiBxjE,OAAOygE,MAAQzgE,OAAOuhE,SAAWvhE,OAAOwhE,YAAc,SAAUT,EAAOU,GACtFV,OAAAA,IAEkB,CAAC90C,GAAO,CAAE9oB,KAAMsgE,IAIzCjD,GAAAA,KACK59C,OAAAA,UAAUg+C,WAAW4C,EAAMx4B,GAIhCw1B,GAAAA,KAAkC,CAC9BqD,IAAAA,EAAYnD,IAAIC,gBAAgB6C,GAC/B9B,OAAAA,GAAcC,mBAAmBkC,EAAW74B,GAIjDw1B,GAAAA,KACKkB,OAAAA,GAAcK,mBAAmByB,EAAMx4B,GAIhD,GAAoB,iBAATw4B,GAAqBA,EAAKryC,cAAgBnnB,OAC/C,IACF,IAAM82D,EAAU,QAAU2C,EAAiB,WAAaK,KAAKN,GACtD9B,OAAAA,GAAcC,mBAAmBb,EAAS91B,SAC1ChjC,GACP,IAAM84D,EAAU,QAAU2C,EAAiB,IAAMM,mBAAmBP,GAC7D9B,OAAAA,GAAcC,mBAAmBb,EAAS91B,GAK/Cg3B,IAAAA,EAAS,IAAIC,WAOZP,OANA/wD,EAAAA,OAAS,SAAU3I,GACxB05D,GAAcC,mBAAmB35D,EAAEqD,OAAOzH,OAAQonC,IAEpDg3B,EAAOE,cAAcsB,GAGd9B,GAAcU,mBAAmBoB,EAAMx4B,OC3Y3Bg5B,YAAQ/uB,GAAA33B,EAAA0mD,EAAA/uB,GAAA13B,IAAAA,EAAAC,EAAAwmD,GAiB3B,SAAAA,EAAax/D,GAAMijB,IAAAA,EAGEA,OAHFplB,OAAA2hE,GACN16C,EAAAuY,EAAXtkB,EAAAA,EAAAzV,UAAMtD,IAyBG,YAAA,SAACwD,GACV,IAAIyf,EAAKmoB,OAAT,CAGK/d,EAAAA,eAAe7pB,EAAG,YACfsE,IAAAA,EAAQmb,EAAKwJ,aAAb3kB,IACJ23D,EAAO,GACc,WAArB9sD,EAAKpO,OAAOuD,GACPA,EAAAA,EACuB,UAArB6K,EAAKpO,OAAOuD,IAAoBA,EAAIrL,OAAS,IACtDgjE,EAAO33D,EAAI,GAAGN,MD+Vb,SAAyBM,GAAK9I,IAAAA,EAAOxC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACvCN,EAAMkxB,EAAAA,EAAQ0uC,GAAAA,IAAmB98D,GACjCwnC,EAAWtqC,EAAOsqC,UAAY1+B,EAAIhE,MAAM,KAAK64D,MAAM74D,MAAM,KAAK,IAAM,WAEnEg6D,GAAaS,gBAAgBz2D,EAAK0+B,EAAUtqC,GChWlCwjE,CADAz8C,EAAK08C,eAAeF,GACZl9D,OAAO6gB,OAAO,GAAIH,EAAK/mB,OAAO0jE,eAAiB,KACtE38C,EAAKmoB,QAAS,EACT6iB,EAAAA,MAAQzyD,OAAO8E,YAAW,WAC7B2iB,EAAKmoB,QAAS,EACP5pC,OAAAA,aAAayhB,EAAKgrC,OACzBhrC,EAAKgrC,MAAQ,OACZ,SA3CHhrC,EAAKgrC,MAAQ,KACbhrC,EAAKmoB,QAAS,EAAKnoB,EALpBu8C,OAMA1hE,EAAA0hE,EAAA,CAAA,CAAAzhE,IAAA,cAAAC,MAED,WACE4pB,EAAAA,EAAA43C,EAAAp8D,+BAAAE,KAAAzG,MACIA,KAAKX,OAAOm2B,UAGhBx1B,KAAKiT,YAAY,iBAAkBjT,KAAK2zB,MAAMwL,UAC9Cn/B,KAAKgjE,SAAWhjE,KAAKwtB,KAAK,QAASxtB,KAAKm/B,SAAU,CAChDxR,IAAK,SAAChnB,GACJA,EAAEutC,iBACFvtC,EAAE+I,qBAGN1P,KAAKiM,KAAK,CAAC,QAAS,YAAajM,KAAKgjE,aACvC,CAAA9hE,IAAA,gBAAAC,MAED,WACS,MAAA,CACLg+B,SAAU8jC,MAEb,CAAA/hE,IAAA,iBAAAC,MAuBD,SAAgB8J,GAEd,IAAKA,EAAInE,MAAM,gBAAiB,CACxBo8D,IAAAA,EAAM59D,SAASC,cAAc,OACnC29D,EAAIz9D,UAAS,YAAArF,OAAe6K,EAAY,WACxCA,EAAMi4D,EAAIl7B,WAAWnpC,KAEhBoM,OAAAA,IACR,CAAA/J,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAA43C,EAAAp8D,2BAAAE,KAAAzG,MACAA,KAAKshC,OAAO,CAAC,QAAS,YAAathC,KAAKm/B,UACjCx6B,OAAAA,aAAa3E,KAAKoxD,OACzBpxD,KAAKoxD,MAAQ,OACd,CAAAlwD,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAGhB,MAAA,sFAAAp1B,OAGC+xB,GAAWnyB,KAAM,gBAAiBA,KAAK4vB,aAAagQ,YAAW,uBAEjE,CAAA,CAAA1+B,IAAA,aAAAK,IA1FD,WACS,MAAA,aAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPo0B,SAAS,EACTutC,cAAe,QAElBJ,GAfmCjuB,ICbjByuB,YAAUvvB,GAAA33B,EAAAknD,EAAAvvB,GAAA13B,IAAAA,EAAAC,EAAAgnD,GAAA,SAAAA,IAAAjnD,OAAAlb,OAAAmiE,GAAAjnD,EAAA/b,MAAAH,KAAAL,WAmB5BwjE,OAnB4BliE,EAAAkiE,EAAA,CAAA,CAAAjiE,IAAA,eAAAC,MAqB7B,SAAcgC,GACiC,kBAAlCA,EAAKwR,OAAOtV,OAAO4/B,aAC5B97B,EAAK9D,OAAOm2B,SAAWryB,EAAKwR,OAAOtV,OAAO4/B,cAE7C,CAAA/9B,IAAA,cAAAC,MAED,WACE4pB,EAAAA,EAAAo4C,EAAA58D,+BAAAE,KAAAzG,MACAA,KAAKiT,YAAY,iBAAkBjT,KAAK2zB,MAAMyvC,gBAC9C,IAAQ/jE,EAAWW,KAAXX,OACHgkE,KAAAA,SAAW,SAACz4C,GACXvrB,EAAOikE,WACTjkE,EAAOqN,MAAQke,EAAKmmB,OACpB1xC,EAAOsN,OAASie,EAAKomB,UAGpBr3B,KAAAA,KAAKF,GAAqBzZ,KAAKqjE,YACrC,CAAAniE,IAAA,iBAAAC,MAED,WACEnB,KAAKuO,OACLvO,KAAKujE,WAAavjE,KAAKujE,WAAWt3D,KAAKjM,MACvCA,KAAKiM,KAAK,CAAC,QAAS,YAAajM,KAAKujE,cACvC,CAAAriE,IAAA,iBAAAC,MAED,SAAgBypB,EAAM44C,GACdC,IAIFj6D,EAJEi6D,EAAWn+D,SAASC,cAAc,KACxCk+D,EAAS5kE,KAAO+rB,EAChB64C,EAAStkC,SAAWqkC,EAGhB,IACwB,oBAAfE,WACDl6D,EAAA,IAAIk6D,WAAW,QAAS,CAC9BC,SAAS,EACT7d,YAAY,EACZ8d,KAAMjlE,UAGA2G,EAAAA,SAASmN,YAAY,gBACvBoxD,eAAe,SAAS,GAAM,EAAOllE,OAAQ,EAAG,EAAG,EAAG,EAAG,GAAG,GAAO,GAAO,GAAO,EAAO,EAAG,YAE5FgI,GACC1H,QAAAA,MAAM,yBAA0B0H,GAGtC6C,GACFi6D,EAASK,cAAct6D,KAE1B,CAAAtI,IAAA,eAAAC,MAED,SAAcuL,EAAOC,GACbo3D,IAAAA,EAASz+D,SAASC,cAAc,UAChCy+D,EAAYD,EAAOE,WAAW,MAEpCjkE,KAAKgkE,UAAYA,EACjBhkE,KAAK+jE,OAASA,EAEPr3D,EAAAA,MAAQA,GAAS1M,KAAKX,OAAOqN,MAC7BC,EAAAA,OAASA,GAAU3M,KAAKX,OAAOsN,OAItCq3D,EAAUE,uBAAwB,EAC9BF,EAAUE,wBACZF,EAAUG,sBAAwB,UAErC,CAAAjjE,IAAA,aAAAC,MAED,SAAYwF,GAAG,IAAAyf,EAAApmB,KACb2G,EAAEutC,iBACFvtC,EAAE+I,kBACG8gB,KAAAA,eAAe7pB,EAAG,QACvB,IAAQtH,EAAWW,KAAXX,OACH+kE,KAAAA,KAAK/kE,EAAOqN,MAAOrN,EAAOsN,QAAQ4gB,MAAK,SAAC3C,GACtC7P,EAAAA,KAAKtB,GAAoBmR,GAC1BvrB,EAAOglE,SACTj+C,EAAKk+C,eAAe15C,EAAMvrB,EAAOqM,KAAOrM,EAAO4J,aAGpD,CAAA/H,IAAA,OAAAC,MAED,SAAMuL,EAAOC,GAAuD,IAAA+a,EAAA1nB,KAA/CukE,EAAM5kE,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAE6kE,QAAS,IAAM1iE,KAAM,aAC3CzC,EAAmBW,KAAnBX,OAAQsV,EAAW3U,KAAX2U,OACV6vD,EAAUD,EAAOC,SAAWnlE,EAAOmlE,QACnC1iE,EAAOyiE,EAAOziE,MAAQzC,EAAOyC,KACnC,OAAO,IAAIoiB,SAAQ,SAACC,EAASiV,GAC3B,IACI4qC,EADAD,EAAS,KAGTpvD,GAAAA,EAAO9C,MAAMkyD,OACfA,EAASpvD,EAAO9C,MAAMkyD,WACjB,CACAr8C,EAAKq8C,QAGHA,EAAAA,OAAOr3D,MAAQA,GAASrN,EAAOqN,MAC/Bq3D,EAAAA,OAAOp3D,OAASA,GAAUtN,EAAOsN,QAHjC83D,EAAAA,aAAa/3D,EAAOC,GAK3Bo3D,EAASr8C,EAAKq8C,OACdC,EAAYt8C,EAAKs8C,UAEjB,IAGIU,EAAIC,EAAIC,EAAIC,EAHVC,EAAanwD,EAAO9C,MAAM6Y,WAAa/V,EAAO9C,MAAM8Y,YACpDo6C,EAAchB,EAAOr3D,MAAQq3D,EAAOp3D,OACpBq4D,EAAKrwD,EAAO9C,MAAM6Y,WAAYu6C,EAAKtwD,EAAO9C,MAAM8Y,YAGlEm6C,EAAaC,GACfH,EAAKb,EAAOr3D,MACZm4D,EAAKd,EAAOr3D,MAAQo4D,EACfJ,EAAA,EACLC,EAAKxgE,KAAKgF,OAAO46D,EAAOp3D,OAASk4D,GAAM,IAC9BC,IAAeC,GACxBH,EAAKb,EAAOr3D,MACZm4D,EAAKd,EAAOp3D,OACP+3D,EAAA,EACAC,EAAA,GACIG,EAAaC,IACtBH,EAAKb,EAAOp3D,OAASm4D,EACrBD,EAAKd,EAAOp3D,OACZ+3D,EAAKvgE,KAAKgF,OAAO46D,EAAOr3D,MAAQk4D,GAAM,GACjCD,EAAA,GAIGO,EAAAA,UAAUvwD,EAAO9C,MArBhB,EAAQ,EAqBuBmzD,EAAIC,EAAIP,EAAIC,EAAIC,EAAIC,GAE5Dl6D,IAAAA,EAAMo5D,EAAOoB,UAAUrjE,EAAM0iE,GAASx9D,QAAQlF,EAAM,sBAExDqiB,EADMxZ,EAAAA,EAAI3D,QAAQ,qBAAsB,uCAG3C,CAAA9F,IAAA,gBAAAC,MAED,WACS,MAAA,CACLiiE,eAAgB,QAEnB,CAAAliE,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAo4C,EAAA58D,2BAAAE,KAAAzG,MACAA,KAAKshC,OAAO,CAAC,QAAS,YAAathC,KAAKujE,YACnC9nD,KAAAA,IAAIhC,GAAqBzZ,KAAKqjE,YACpC,CAAAniE,IAAA,SAAAC,MAED,WACM,IAAAnB,KAAKX,OAAOm2B,QAAZ,CAGJ,IAAMhwB,EAAYxF,KAAK2zB,MAAMyvC,eAAiB,gBAAkB,yBAC1D9tC,EAAU,aAChB,MAAA,8DAAAl1B,OAEgBoF,EAAS,cAAApF,OACrBJ,KAAK2zB,MAAMyvC,eAAiB,GAAEhjE,mBAAAA,OAAsBJ,KAAKgwB,SAASsF,GAAQl1B,MAAAA,OAAKJ,KAAKoV,KAAKkgB,GAAiB,WAAA,sCAG/G,CAAA,CAAAp0B,IAAA,aAAAK,IAjLD,WACS,MAAA,eACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPojE,QAAS,IACT1iE,KAAM,YACNmH,OAAQ,OACRyD,MAAO,IACPC,OAAQ,IACR03D,SAAS,EACTf,UAAU,EACV9tC,SAAS,EACT9pB,KAAM,kBAETy3D,GAnBqCzuB,ICFnB0wB,GAAU,WAC7B,SAAAA,EAAajiE,GAAMnC,OAAAokE,GACjBplE,KAAKX,OAAS8D,EAAK9D,OACnBW,KAAKq0B,OAASlxB,EAAK6P,KACnBhT,KAAKgT,KAAO8C,EAAK9Q,UAAU,KAAM,GAAI,GAAE,wCAAA5E,OAA0CJ,KAAKX,OAAOmG,YACxFwN,EAAAA,KAAKC,YAAYjT,KAAKgT,MACnB68B,IAAAA,EAAc7vC,KAAKX,OAAnBwwC,UACJA,GACF7vC,KAAKi1B,SAAS,CAAE4a,UAAAA,IAElB7vC,KAAKqlE,YAAcrlE,KAAKqlE,YAAYp5D,KAAKjM,MACzCA,KAAKslE,iBACL,IAAMz5D,EAAyC,UAA7B7L,KAAKX,OAAO4wB,aAA2B,WAAa,QACjEs1C,KAAAA,WAAavxC,GAAO6B,SAASpvB,KAAKzG,KAAMA,KAAKgT,KAAM,KAAMnH,EAAW7L,KAAKqlE,aA0F/ED,OAzFAnkE,EAAAmkE,EAAA,CAAA,CAAAlkE,IAAA,iBAAAC,MAED,SAAgBypB,GAAM,IAAAxE,EAAApmB,KACZX,EAAiBW,KAAjBX,OAAQ2T,EAAShT,KAATgT,KACZ4X,EACFvrB,EAAOurB,KAAOA,EAEdA,EAAOvrB,EAAOurB,KAGZvrB,EAAO2N,OACTtH,OAAOC,KAAKtG,EAAO2N,OAAOpF,KAAI,SAAA1G,GACvB8L,EAAAA,MAAM9L,GAAO7B,EAAO6B,MAIzB0pB,EAAKhrB,OAAS,IAChBI,KAAKwlE,SAAW9/D,OAAOC,KAAKilB,EAAK,KAGnC5qB,KAAKgT,KAAKvN,UAAY,GAEjBmC,EAAAA,KAAI,SAAC/B,EAAMzE,GACRoE,IAAAA,EAAYK,EAAK4/D,SAAW,uBAAyB,cAC3D5/D,EAAK,cAAgBzE,EACrBglB,EAAKpT,KAAKC,YAAY6C,EAAK9Q,UAAU,cAAI5E,OAAWyF,EAAK6/D,oBAAmB7/D,EAAML,SAErF,CAAAtE,IAAA,cAAAC,MAED,SAAawF,GACNA,EAAEorB,iBACLprB,EAAEorB,eAAiBprB,EAAEqD,QAEvB,IAAMA,EAASrD,EAAEorB,eACjB,GAAI/nB,GAAU8L,EAAKxP,SAAS0D,EAAQ,YAC3B,OAAA,EAEH27D,IAAAA,EAAoD,mBAA5B3lE,KAAKX,OAAOgmE,YAA6BrlE,KAAKX,OAAOgmE,YAAc,KAC3FO,EAAc5lE,KAAKgT,KAAKhL,cAAc,aACvC5B,EAAAA,SAAS4D,EAAQ,YACP8L,GAAAA,EAAK3O,YAAYy+D,EAAa,YAC7CD,EAAeh/D,EAAG,CAChBg8B,KAAMijC,EAAc5lE,KAAK6lE,WAAWD,EAAa5lE,KAAKwlE,UAAY,KAClE5iC,GAAI5iC,KAAK6lE,WAAW77D,EAAQhK,KAAKwlE,cAEpC,CAAAtkE,IAAA,aAAAC,MAED,SAAYkE,EAAKM,GACX,IAACN,IAAQM,EACX,MAAO,GAET,IAAM4E,EAAM,GACP3C,EAAAA,KAAI,SAAA1G,GACHA,EAAAA,GAAOmE,EAAIwB,aAAa3F,MAExBE,IAAAA,EAAQiE,EAAIwB,aAAa,cAIxB0D,OAHHnJ,IACEA,EAAAA,MAAQk1B,OAAOl1B,IAEdmJ,IACR,CAAArJ,IAAA,OAAAC,MAGD,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,QACvB5M,EAAAA,SAASpG,KAAKgT,KAAM,YAC1B,CAAA9R,IAAA,OAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,UACvB5M,EAAAA,SAASpG,KAAKgT,KAAM,UAC1B,CAAA9R,IAAA,WAAAC,MAED,SAAU6L,GAAO,IAAA0a,EAAA1nB,KACf0F,OAAOC,KAAKqH,GAAOpH,SAAQ,SAAC1E,GACrB8R,EAAAA,KAAKhG,MAAM9L,GAAO8L,EAAM9L,QAEhC,CAAAA,IAAA,UAAAC,MAED,WACMnB,KAAKulE,aACFA,KAAAA,WAAW39D,KAAI,SAAA/B,GACb+qB,EAAAA,SAAW/qB,EAAK+qB,aAEvB5wB,KAAKulE,WAAa,MAEpBvlE,KAAKgT,KAAKvN,UAAY,KACjB4uB,KAAAA,OAAOxL,YAAY7oB,KAAKgT,MAC7BhT,KAAKgT,KAAO,SACboyD,EAvG4B,GCGzBU,GACE,OADFA,GAEI,SAFJA,GAGK,UAGLC,GACG,QADHA,GAEG,QAsBLC,IAAAA,GAA+B,WAAnB7+C,GAAQhG,OAEH8kD,YAAW1lC,GAAAtkB,EAAAgqD,EAAA1lC,GAAArkB,IAAAA,EAAAC,EAAA8pD,GAuB9B,SAAAA,EAAa9iE,GAAMijB,IAAAA,EAKAA,OALAplB,OAAAilE,GACNh+C,EAAAuY,EAAXtkB,EAAAA,EAAAzV,UAAMtD,IA6GE,WAAA,SAACwD,GACTA,EAAE+I,kBACF0W,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,aAEnB1H,EAAK8/C,kBAAkBv/D,MACxBshB,EAAAuY,EAAApa,GAEmB,qBAAA,SAACzf,GACnBA,EAAE+I,kBACqB0W,EAAK/mB,OAApB8mE,aACWJ,GACZK,EAAAA,QAAQhgD,EAAK1J,UAElB0J,EAAKggD,QAAO,MAEfn+C,EAAAuY,EAAApa,GAES,WAAA,SAACzf,GACTA,EAAE+I,kBACF0W,EAAKrL,KAAK,kBAAmB,CAC3B+S,WAAY1H,EAAK0H,aAEf1H,EAAK/mB,OAAOgnE,WAAaP,IACtBppD,EAAAA,UAAY0J,EAAKggD,QAAO,MAEhCn+C,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GAEbyf,EAAKkgD,UAAY,KAClBr+C,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GAEbyf,EAAKkgD,UAAY,EACZ5pD,EAAAA,UAAY0J,EAAKggD,QAAO,MAhJ7BhgD,EAAKmgD,SAAU,EACfngD,EAAK1J,UAAW,EAChB0J,EAAKogD,SAAW,KAChBpgD,EAAKmxB,SAAW,EAACnxB,EAPlB6/C,OAQAhlE,EAAAglE,EAAA,CAAA,CAAA/kE,IAAA,aAAAC,MAED,SAAYA,GACVnB,KAAKslE,eAAetlE,KAAKX,OAAOqC,KAAM1B,KAAKu3C,YAC5C,CAAAr2C,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACLX,EAAWW,KAAXX,OACRW,KAAK6zC,aACOmyB,GAAAA,IAAmC,UAAtBhmE,KAAKiwB,eACM,WAAnB9I,GAAQhG,QAAuB9hB,EAAOgnE,WAAaP,KAClEzmE,EAAOgnE,SAAWP,IAGpBzmE,EAAOonE,cAAgB3wD,EAAK1P,SAASpG,KAAKgT,KAAM,YAEhDhT,KAAKub,GAAG,CAAC9B,GAAqBA,KAA2B,WACvDiO,EAAKg/C,iBAGF/sD,KAAAA,KAAKF,GAAgB,WACpBpa,EAAOqC,MAAQrC,EAAOqC,KAAK9B,OAAS,IACjC0lE,EAAAA,eAAejmE,EAAOqC,MAC3BgmB,EAAKnZ,WAIIy3D,IAAAhmE,KAAKub,GAAG9B,GAAqB,WACnCiO,EAAKhL,WAGLiqD,EAAAA,aAAej/C,EAAKi/C,YAAYt4D,OACrCqZ,EAAKhL,UAAW,MAGdspD,IACF3mE,EAAO8mE,WAAaJ,GACpB/lE,KAAK4mE,YAAc,YAEnB5mE,KAAK4mE,YAAcvnE,EAAO8mE,aAAeJ,GAAqB,QAAU,aAGtE1mE,EAAO8mE,aAAeJ,GACxB/lE,KAAKiM,KAAKjM,KAAK4mE,YAAa5mE,KAAKkmE,oBAEjClmE,KAAKiM,KAAKjM,KAAK4mE,YAAa5mE,KAAK6mE,SAC5B56D,KAAAA,KAAK,aAAcjM,KAAK8mE,UAE/B9mE,KAAKumE,SAAWvmE,KAAKiM,KAAK,QAASjM,KAAK+mE,eACzC,CAAA7lE,IAAA,YAAAC,MAED,WAAa,IAAAwmB,EAAA3nB,KACH2zB,EAAU3zB,KAAV2zB,MACFpL,EAAK7iB,OAAOC,KAAKguB,GACnBqzC,GAAW,EACXz+C,EAAG3oB,OAAS,IACXgG,EAAAA,SAAQ,SAAA1E,GACJ+R,EAAAA,YAAY,iBAAkB0gB,EAAMzyB,KACxC8lE,IAAaA,EAAWrzC,EAAMzyB,OAEjClB,KAAKumE,QAAUS,GAEbA,IAGC/zD,KAAAA,YAAY,iBAAkB6C,EAAK9Q,UAAU,OAAQ,GAAI,GAAI,cAClE8Q,EAAK1P,SAASpG,KAAKy1B,KAAK,kBAAmB,eAG7C,CAAAv0B,IAAA,OAAAC,MAIA,SAAMA,IACCnB,KAAKX,OAAOqC,MAAQ1B,KAAKX,OAAOqC,KAAK9B,OAAS,GAG9CwG,EAAAA,SAASpG,KAAKgT,KAAM,UAC1B,CAAA9R,IAAA,OAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,UAC7B,CAAA9R,IAAA,gBAAAC,MAED,SAAe0E,EAAM3E,EAAK6b,GACxB,QAAa1Z,IAATwC,EACK,MAAA,GAEDnE,IAAAA,EAAS1B,KAAKX,OAAdqC,MACPqb,IAASA,EAAO/c,KAAK2U,OAAOoI,MAC7B7b,GAAQA,GAAO4U,EAAKtH,YAAY3I,EAAK3E,IAAS,OAASA,EACvC,iBAAT2E,IAAsBA,EAAOnE,EAAKmE,IACrC,IACF,MAAyB,WAArB9D,EAAO8D,EAAK3E,IACP2E,EAAK3E,GAAK6b,IAASlX,EAAK3E,GAAKmc,GAE7BxX,EAAK3E,SAEPmF,GAEA,OADPpG,QAAQf,KAAKmH,GACN,MAEV,CAAAnF,IAAA,SAAAC,MA0CD,SAAQub,GACN,GAAIA,IAAa1c,KAAK0c,WAAY1c,KAAKX,OAAOm2B,QAA9C,CACQhP,IAAAA,EAAaxmB,KAAK2U,OAAlB6R,SACA6/C,EAAarmE,KAAKX,OAAlBgnE,SACJ3pD,GACF2pD,IAAaP,GAAkBt/C,EAAS4a,OAAS5a,EAASka,QACrDimC,KAAAA,aAAe3mE,KAAK2mE,YAAYp4D,SAErC83D,IAAaP,GAAkBt/C,EAASka,QAAUla,EAASygD,cACtDN,KAAAA,aAAe3mE,KAAK2mE,YAAYt4D,QAEvCrO,KAAK0c,SAAWA,KAGlB,CAAAxb,IAAA,cAAAC,MACA,SAAawF,EAAGikB,GACdjkB,EAAE+I,kBACF,IAAAkxB,EAA2B5gC,KAAKX,OAAxBgnE,EAAQzlC,EAARylC,SAAU3kE,EAAIk/B,EAAJl/B,KACb61C,KAAAA,SAAW3sB,EAAKgY,GAAGxhC,MACnB8lE,KAAAA,QAAUxlE,EAAK1B,KAAKu3C,UACzBv3C,KAAKmnE,qBACuBnnE,KAAKX,OAAzB+nE,iBACYpB,IAAaK,IAAaP,KAAoB9lE,KAAKomE,QAAO,KAC/E,CAAAllE,IAAA,cAAAC,MAED,SAAawF,MAEZ,CAAAzF,IAAA,oBAAAC,MAED,WACE,IAAInB,KAAKumE,QAAT,CAGQ7kE,IAAAA,EAAS1B,KAAKX,OAAdqC,KAEFwlE,EAAUxlE,EADF1B,KAAKu3C,SAAW71C,EAAK9B,OAASI,KAAKu3C,SAAW,GAEvD2vB,IACLlnE,KAAKy1B,KAAK,cAAchwB,UAAYzF,KAAKqnE,cAAcH,EAAS,gBACjE,CAAAhmE,IAAA,iBAAAC,MAED,SAAgBmmE,EAAU/vB,GAAU,IAAA3vB,EAAA5nB,KAC1BX,EAAgCW,KAAhCX,OAAQsnE,EAAwB3mE,KAAxB2mE,YAAahyD,EAAW3U,KAAX2U,OAM7B,GALwB,iBAAb4iC,IACTv3C,KAAKu3C,SAAWA,EACX2vB,KAAAA,QAAU7nE,EAAOqC,KAAK61C,IAGzBovB,EAGF,OAFAA,EAAYrB,eAAegC,QAC3BtnE,KAAKmnE,oBAIP,IAvPuBd,EAAU1tC,EAuP3Bx2B,EAAU,CACd9C,OAAQ,CACNurB,KAAM08C,GAAY,GAClB9hE,WA1PmB6gE,EA0PShnE,EAAOgnE,SA1PN1tC,EA0PgBt5B,EAAOs5B,SAzPtD0tC,IAAaP,GACRntC,IAAalG,GAAUI,cAAgB,4BAA8B,6BAErE,IAuPHwyC,YAAa,SAAC1+D,EAAGikB,GACVy6C,EAAAA,YAAY1+D,EAAGikB,IAEtBqF,aAAc+1C,GAAY,QAAU,SAEtChzD,KAAM3T,EAAOgnE,WAAaP,GAAmBnxD,EAAO2wB,gBAAkB3wB,EAAO3B,KAAQhT,KAAKgT,MAGxF,GAAAhT,KAAKX,OAAO4tD,WAAY,CAC1B,IAAQtgD,EAAW3M,KAAK2U,OAAO3B,KAAKu0B,wBAA5B56B,OACF46D,EAAQloE,EAAOgnE,WAAaP,GAAoBn5D,EAAS,GAAKA,EAChE46D,GAASloE,EAAOmoE,cAClBrlE,EAAQ9C,OAAOwwC,aAASzvC,OAAMmnE,EAAS,OAEpCZ,KAAAA,YAAc,IAAIvB,GAAWjjE,GAClCnC,KAAKmnE,oBACLnnE,KAAKuO,OAEPvO,KAAK0mE,gBACN,CAAAxlE,IAAA,cAAAC,MAED,WACM,GAACnB,KAAKX,OAAOmoE,YAAb,CAGJ,IAAQ76D,EAAW3M,KAAK2U,OAAO3B,KAAKu0B,wBAA5B56B,OACF46D,EAAQvnE,KAAKX,OAAOgnE,WAAaP,GAAoBn5D,EAAS,GAAKA,EACpEg6D,KAAAA,aAAe3mE,KAAK2mE,YAAY1xC,SAAS,CAAE4a,UAAS,GAAAzvC,OAAKmnE,EAAK,WACpE,CAAArmE,IAAA,UAAAC,MAED,WACqBnB,KAAXX,OACG8mE,aAAeJ,GACxB/lE,KAAKshC,OAAOthC,KAAK4mE,YAAa5mE,KAAKkmE,oBAEnClmE,KAAKshC,OAAOthC,KAAK4mE,YAAa5mE,KAAK6mE,SAC9BvlC,KAAAA,OAAO,aAActhC,KAAK8mE,UAEjC9mE,KAAKumE,SAAWvmE,KAAKshC,OAAO,QAASthC,KAAK+mE,aACtC/mE,KAAK2mE,cACP3mE,KAAK2mE,YAAY/1C,UACjB5wB,KAAK2mE,YAAc,QAEtB,CAAAzlE,IAAA,SAAAC,MAED,WACM,GAACnB,KAAKX,OAAO4tD,WAGjB,MAAA7sD,mCAAAA,OAA0CJ,KAAKX,OAAOmG,WAAa,GAAE,qEAItE,CAAA,CAAAtE,IAAA,aAAAK,IA1RD,WACS,MAAA,gBAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLo3B,SAAUlG,GAAUM,eACpB3xB,MAAO,IACPM,KAAM,GACN2kE,SAAU,UACVoB,UAAW,GACXhB,cAAc,EACdxZ,YAAY,EACZma,iBAAiB,EACjBjB,WAAYJ,GACZyB,aAAa,OAEhBvB,GArBsCjyC,IClBpB0zC,YAAcC,GAAA1rD,EAAAyrD,EAAAC,GAAAzrD,IAAAA,EAAAC,EAAAurD,GAqCjC,SAAAA,EAAavkE,GAAMijB,IAAAA,EAIGA,OAJHplB,OAAA0mE,IACjBxrD,EAAAA,EAAAzV,UAAMtD,IAED4mC,QAAU,EACf3jB,EAAK4jB,UAAW,EAAI5jB,EArBrBshD,OAsBAzmE,EAAAymE,EAAA,CAAA,CAAAxmE,IAAA,eAAAC,MApBD,SAAcgC,GACJzB,IAAAA,EAASyB,EAAK9D,OAAdqC,KACJ5B,MAAMsuB,QAAQ1sB,IAASA,EAAK9B,OAAS,IACvCuD,EAAK9D,OAAOqC,KAAOA,EAAKkG,KAAI,SAAA/B,GAOnBA,OANFA,EAAK+I,MAAQ/I,EAAK6F,OACrB7F,EAAK+I,KAAO/I,EAAK6F,MAEd7F,EAAK+I,OACR/I,EAAK+I,KAAO/I,EAAK25B,YAEZ35B,QAGZ,CAAA3E,IAAA,cAAAC,MASD,WAAe,IAAAumB,EAAA1nB,KACb+qB,EAAAA,EAAA28C,EAAAnhE,+BAAAE,KAAAzG,MACKub,KAAAA,GAAG,iBAAiB,SAAC7Z,GACxBgmB,EAAKkgD,qBAAqBlmE,MAGvB6Z,KAAAA,GAAG9B,IAA0B,SAACmR,GACjClD,EAAK49C,eAAe59C,EAAKroB,OAAOqC,KAAMkpB,EAAKgY,OAEzC5iC,KAAK2U,OAAOkzD,eAAejoE,OAAS,GACtCI,KAAKqO,SAIT,CAAAnN,IAAA,OAAAC,MAIA,SAAMA,IACCnB,KAAKX,OAAOqC,MAAQ1B,KAAKX,OAAOqC,KAAK9B,OAAS,GAG9CwG,EAAAA,SAASpG,KAAKgT,KAAM,UAC1B,CAAA9R,IAAA,iBAAAC,MAED,WACE,IAAAy/B,EAAoC5gC,KAAKX,OAAjCqC,EAAIk/B,EAAJl/B,KAAMwkC,EAAiBtF,EAAjBsF,kBACVxkC,GAAAA,EAAK9B,OAAS,EAAG,CACnB,IAAIgjC,EAAK,KACJh7B,EAAAA,KAAI,SAAA/B,GACHA,EAAK25B,aAAe0G,IACjBrgC,EAAAA,MAGJ+8B,IACHA,EAAKlhC,EAAK,IAEZ1B,KAAK8xC,iBAAiBlP,MAEzB,CAAA1hC,IAAA,iBAAAC,MAED,WAAmD,IAAAwmB,EAAA3nB,KAAnC0B,EAAI/B,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA0D,GAAA1D,aAAGK,KAAKX,OAAOqC,MAAQ,GAAIkhC,EAAEjjC,UAAAC,OAAAD,EAAAA,kBAAA0D,EACzCuuC,EAAYhP,GAAMA,EAAGpD,WAAaoD,EAAGpD,WAAax/B,KAAKX,OAAO6mC,kBAChEtD,GACGh9B,EAAAA,SAAQ,SAACC,GACZA,EAAK4/D,UAAW,KAGpB,IAAIluB,EAAW,EACTuwB,EAAQpmE,EAAKkG,KAAI,SAAC/B,EAAMzE,GACtB2mE,IAAAA,EAAQx3C,EAAAA,KACT1qB,GAAI,GAAA,CACP6/D,SAAU/9C,EAAK0/C,cAAcxhE,IAASA,EAAK25B,WAC3CimC,UAAU,IAULsC,OAPHliE,EAAK4/D,UAAa5/D,EAAK25B,YAEtB35B,EAAK25B,YAAcoS,KAEtBm2B,EAAStC,UAAW,EACTrkE,EAAAA,GAEN2mE,KAETh9C,EAAAA,EAAA28C,EAAAnhE,WAAA,iBAAAvG,MAAAyG,KAAAzG,KAAqB8nE,EAAOvwB,KAG9B,CAAAr2C,IAAA,uBAAAC,MACA,SAAsBO,GACf5B,MAAMsuB,QAAQ1sB,KAGnB1B,KAAKX,OAAOqC,KAAOA,EAAKkG,KAAI,SAAA/B,GAOnBA,OANFA,EAAK+I,MAAQ/I,EAAK6F,OACrB7F,EAAK+I,KAAO/I,EAAK6F,MAEd7F,EAAK+I,OACR/I,EAAK+I,KAAO/I,EAAK25B,YAEZ35B,KAET7F,KAAKslE,iBACAjmE,KAAAA,OAAOqC,KAAK9B,OAAS,EAAII,KAAKqO,OAASrO,KAAKuO,UAClD,CAAArN,IAAA,mBAAAC,MAED,SAAkByhC,EAAID,GACfhuB,KAAAA,OAAOm9B,iBAAiBlP,EAAID,KAClC,CAAAzhC,IAAA,cAAAC,MAED,SAAawF,EAAGikB,GACNi9C,IAAAA,EAAmB7nE,KAAK2U,OAAxBkzD,eACR98C,EAAAA,EAAA28C,EAAAnhE,WAAA,cAAAvG,MAAAG,MAAAH,KAAqBL,WAChB6wB,KAAAA,eAAe7pB,EAAG,oBAAqB,CAAEg8B,KAAM/X,EAAK+X,KAAMC,GAAIhY,EAAKgY,KACxE,IAAA,IAASjhC,EAAI,EAAGA,EAAIkmE,EAAejoE,OAAQ+B,IACrCipB,EAAKgY,IAAMilC,EAAelmE,GAAG69B,aAAe5U,EAAKgY,GAAGpD,aACjDoD,EAAAA,GAAG33B,IAAM48D,EAAelmE,GAAGsJ,KAG9B2f,EAAK+X,MAASklC,EAAelmE,GAAG69B,aAAe5U,EAAK+X,KAAKnD,aACtDmD,EAAAA,KAAK13B,IAAM48D,EAAelmE,GAAGsJ,KAGtCjL,KAAK2U,OAAOm9B,iBAAiBlnB,EAAKgY,GAAIhY,EAAK+X,SAC5C,CAAA,CAAAzhC,IAAA,aAAAK,IAnJD,WACS,MAAA,eAGT,CAAAL,IAAA,gBAAAK,IAGA,WACEgvB,OAAAA,EAAAA,EACK01C,GAAAA,GAAYzsC,eAAa,GAAA,CAC5Bb,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPM,KAAM,GACNwkC,kBAAmB,GACnB1Q,SAAS,EACTixC,cAAc,EACdjhE,UAAW,sBACXynD,YAAY,QAEfya,GApByCzB,ICJvB+B,YAAYL,GAAA1rD,EAAA+rD,EAAAL,GAAAzrD,IAAAA,EAAAC,EAAA6rD,GAoB/B,SAAAA,EAAa7kE,GAAMijB,IAAAA,EAEDA,OAFCplB,OAAAgnE,IACjB9rD,EAAAA,EAAAzV,UAAMtD,IACD8kE,QAAU,EAAC7hD,EAJjB4hD,OAKA/mE,EAAA+mE,EAAA,CAAA,CAAA9mE,IAAA,eAAAC,MAED,SAAcgC,GACJ2iB,IAAAA,EAAiB3iB,EAAKwR,OAAOtV,OAA7BymB,aACFpkB,EAAQokB,EAAoBhmB,MAAMsuB,QAAQtI,GAAgBA,EAAe3iB,EAAK9D,OAAOqC,KAA9D,GACzB5B,MAAMsuB,QAAQ1sB,KAChByB,EAAK9D,OAAOqC,KAAOA,EAAKkG,KAAI,SAAA/B,GASnBA,MARa,iBAATA,EACFA,EAAA,CACLmkB,KAAMnkB,EACN+I,KAAI,GAAAxO,OAAKyF,EAAI,OAELA,EAAK+I,MAAQ/I,EAAKmkB,OAC5BnkB,EAAK+I,KAAIxO,GAAAA,OAAMyF,EAAKmkB,KAAO,MAEtBnkB,QAGZ,CAAA3E,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACb+qB,EAAAA,EAAAi9C,EAAAzhE,+BAAAE,KAAAzG,MACKub,KAAAA,GAAG9B,GAAoB,WACtBiO,EAAK8+C,WAAa9+C,EAAK/S,OAAOmR,cAGlC4B,EAAK49C,oBAEPtlE,KAAKslE,mBAGP,CAAApkE,IAAA,OAAAC,MAIA,SAAMA,GACCnB,KAAKX,OAAOqC,MAAoC,IAA5B1B,KAAKX,OAAOqC,KAAK9B,QAG1CmrB,EAAAA,EAAAi9C,EAAAzhE,wBAAAE,KAAAzG,QACD,CAAAkB,IAAA,cAAAC,MAED,SAAawF,EAAGqxC,GACdjtB,EAAAA,EAAAi9C,EAAAzhE,WAAA,cAAAvG,MAAAyG,KAAAzG,KAAkB2G,EAAGqxC,GACrB,IAAMhuC,EAASrD,EAAEorB,eACX/H,EAAOsM,OAAOtsB,EAAOnD,aAAa,SACxC,IAAKmjB,GAAQA,IAAShqB,KAAKwmE,SAClB,OAAA,EAET,IAAM/jC,EAAQ,CACZ3c,aAAc,CACZ6c,KAAM3iC,KAAK2U,OAAOmR,aAClB8c,GAAI5Y,IAGHwG,KAAAA,eAAe7pB,EAAG,cAAe,CAAE87B,MAAAA,IACxCziC,KAAKwmE,SAAWx8C,EAChBhqB,KAAK2U,OAAOmR,aAAekE,IAC5B,CAAA9oB,IAAA,iBAAAC,MAED,WAAkB,IAAAwmB,EAAA3nB,KACV8lB,EAAe9lB,KAAK2U,OAAOmR,cAAgB,EACjD9lB,KAAKwmE,SAAW1gD,EAChB,IAAIyxB,GAAW,EACTuwB,EAAQ9nE,KAAKX,OAAOqC,KAAKkG,KAAI,SAAC/B,EAAMzE,GACxC,IAAM8mE,EAAW,CACfl+C,KAAMnkB,EAAKmkB,MAONk+C,OALHA,EAASl+C,OAASlE,IACpBoiD,EAASzC,UAAW,EACTrkE,EAAAA,GAEJskE,EAAAA,SAAW/9C,EAAK0/C,cAAcxhE,GAChCqiE,KAETn9C,EAAAA,EAAAi9C,EAAAzhE,WAAA,iBAAAvG,MAAAyG,KAAAzG,KAAqB8nE,EAAOvwB,KAC7B,CAAAr2C,IAAA,oBAAAC,MAED,WACE,IAAInB,KAAKumE,QAAT,CAGQ7kE,IAAAA,EAAS1B,KAAKX,OAAdqC,KAEFwlE,EAAUxlE,EADF1B,KAAKu3C,SAAW71C,EAAK9B,OAASI,KAAKu3C,SAAW,GAExD4wB,EAAQ,GAGVA,GADGjB,GAAWlnE,KAAKu3C,SAAW,EACzB,GAAAn3C,OAAMJ,KAAK2U,OAAOmR,aAAe,KAE9B9lB,KAAKqnE,cAAcH,EAAS,YAEjCzxC,KAAAA,KAAK,cAAchwB,UAAY0iE,KACrC,CAAAjnE,IAAA,UAAAC,MAED,WACE4pB,EAAAA,EAAAi9C,EAAAzhE,2BAAAE,KAAAzG,SACD,CAAA,CAAAkB,IAAA,aAAAK,IAvHD,WACS,MAAA,iBAGT,CAAAL,IAAA,gBAAAK,IAGA,WACEgvB,OAAAA,EAAAA,EACK01C,GAAAA,GAAYzsC,eAAa,GAAA,CAC5Bb,SAAUlG,GAAUM,eACpB3xB,MAAO,EACPM,KAAM,CAAC,EAAG,IAAK,EAAG,IAAM,IACxB8D,UAAW,wBACXynD,YAAY,EACZwZ,cAAc,QAEjBuB,GAlBuC/B,ICZrBmC,YAAW7nC,GAAAtkB,EAAAmsD,EAAA7nC,GAAArkB,IAAAA,EAAAC,EAAAisD,GAAA,SAAAA,IAAAlsD,OAAAlb,OAAAonE,GAAAlsD,EAAA/b,MAAAH,KAAAL,WAG7ByoE,OAH6BnnE,EAAAmnE,EAAA,CAAA,CAAAlnE,IAAA,cAAAC,MAK9B,WAAe,IAAAilB,EAAApmB,KACbA,KAAK4lD,aAAe5lD,KAAKwtB,KAAK,aAAcxtB,KAAKqoE,WAAY,CAC3D16C,IAAK,SAAChnB,GACJA,EAAEutC,iBACFvtC,EAAE+I,qBAIN1P,KAAKqqC,QAAUrqC,KAAKwtB,KAAK,YAAaxtB,KAAKsoE,aAE3CtoE,KAAKiM,KAAK,0BAA2B,QAASjM,KAAK4lD,cAE9CrqC,KAAAA,GAAG9B,GAAc,SAACxa,GACrBmnB,EAAKikB,QAAQprC,QAEhB,CAAAiC,IAAA,aAAAC,MAED,SAAYwF,GACV3G,KAAKwwB,eAAe7pB,EAAG,cAAe,IACtC3G,KAAK2U,OAAO4zD,UACb,CAAArnE,IAAA,cAAAC,MAED,WAAalC,IAAAA,EAAKU,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACXgV,EAAW3U,KAAX2U,OACF7S,EAAO7C,EAAM4V,UACf2zD,EAAY7zD,EAAO6zD,UAAYxoE,KAAKoV,KAAKT,EAAO6zD,WAAa,GACjE,IAAKA,EACK1mE,OAAAA,GACD,IAAA,UACH0mE,EAAYxoE,KAAKoV,KAAK2J,iBACtB,MACG,IAAA,UACHypD,EAAYxoE,KAAKoV,KAAK0J,kBACtB,MAAA,QAEA0pD,EAAYxoE,KAAKoV,KAAK4J,4BAGvByW,KAAAA,KAAK,wBAAwBhwB,UAAY+iE,EAC9CxoE,KAAKy1B,KAAK,wBAAwBhwB,UAASrF,GAAAA,OAAMJ,KAAKoV,KAAKgL,aAAY,yCAAAhgB,OAAwCJ,KAAKoV,KAAKiL,QAAgB,aAC1I,CAAAnf,IAAA,UAAAC,MAED,WACEnB,KAAKshC,OAAO,0BAA2B,QAASthC,KAAK4lD,gBACtD,CAAA1kD,IAAA,SAAAC,MAED,WACE,MAAA,0PAMD,CAAA,CAAAD,IAAA,aAAAK,IAzDD,WACS,MAAA,YACR6mE,GAHsCp0C,ICGnCy0C,YAAMloC,GAAAtkB,EAAAwsD,EAAAloC,GAAArkB,IAAAA,EAAAC,EAAAssD,GAAA,SAAAA,IAAAvsD,OAAAlb,OAAAynE,GAAAvsD,EAAA/b,MAAAH,KAAAL,WAkBT8oE,OAlBSxnE,EAAAwnE,EAAA,CAAA,CAAAvnE,IAAA,cAAAC,MAoBV,WAAe,IAAAilB,EAAApmB,KAIbA,KAAK0oE,WAAa,EAClB1oE,KAAK2oE,aAAe,KACpB3oE,KAAKiM,KAAK,aAAc,CAAC,QAAS,aAAa,SAACtF,IAC1Cyf,EAAK/mB,OAAOu1C,SAAWxuB,EAAKwiD,iBAC9BjiE,EAAEutC,iBACFvtC,EAAE+I,kBACGk5D,EAAAA,cAAgBxiD,EAAKwiD,cAAcjiE,GAAKyf,EAAK/mB,OAAOu1C,QAAQjuC,OAIhEgO,KAAAA,OAAOk0D,WAAa,WAClBA,EAAAA,WAAU1oE,MAAfimB,EAAIzmB,YAGDgV,KAAAA,OAAOm0D,WAAa,WACvB1iD,EAAK/X,UAER,CAAAnN,IAAA,WAAAC,MAED,SAAU6L,GAAO,IAAA0a,EAAA1nB,KACf0F,OAAOC,KAAKqH,GAAOpF,KAAI,SAAA1G,GAChB8R,EAAAA,KAAKhG,MAAM9L,GAAO8L,EAAM9L,QAEhC,CAAAA,IAAA,aAAAC,MAED,SAAYgkB,GAAyC,IAAAwC,EAAA3nB,KAAjCX,EAAMM,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAAIi1C,EAAOj1C,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,aACzC,GAAKwlB,EAAL,CAGAnlB,KAAK4oE,cAAgBh0B,EACbm0B,IAAAA,EAAa/oE,KAAKX,OAAlB0pE,SACJ/oE,KAAK0oE,aACP/jE,aAAa3E,KAAK0oE,YAClB1oE,KAAK0oE,WAAa,MAEftiE,EAAAA,SAASpG,KAAKgT,KAAM,QACT,UAAhB3T,EAAOo3B,MAAoB3gB,EAAK1P,SAASpG,KAAKgT,KAAM,SAE7CyiB,KAAAA,KAAK,2BAA2BhwB,UADjB,iBAAX0f,EACwCA,EAEA,GAAA/kB,OAAG+kB,EAAOvW,MAAQ,IAAE,GAAAxO,OAAQ+kB,EAAO6jD,UAAS,wBAAA5oE,OAA2B+kB,EAAO6jD,UAAS,QAAS,IAGnJ3pE,EAAO2N,OAAShN,KAAKi1B,SAAS51B,EAAO2N,OAE/B2zB,IAAAA,EAAsC,kBAApBthC,EAAOshC,SAAyBthC,EAAOshC,SAAW3gC,KAAKX,OAAOshC,SACtF,GAAIA,EAAU,CACNsoC,IAAAA,EAAe5pE,EAAO0pE,UAAYA,EACnCL,KAAAA,WAAajlE,YAAW,WAC3BkkB,EAAKtZ,SACJ46D,OAEN,CAAA/nE,IAAA,OAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,QACvB7L,EAAAA,YAAYnH,KAAKgT,KAAM,SACvBA,KAAAA,KAAK+V,gBAAgB,SAC1B/oB,KAAK4oE,cAAgB,OACtB,CAAA1nE,IAAA,SAAAC,MAED,WACE,MAAA,qCAAAf,OAA4Co7B,GAAYgB,gBAAe,6EAGxE,CAAA,CAAAt7B,IAAA,aAAAK,IAxFD,WACS,MAAA,WACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLwnE,SAAU,IACV/7D,MAAO,GACPypB,KAAM,QACNkK,UAAU,EACVxb,OAAQ,CACNvW,KAAM,GACNo6D,UAAW,IAEbp0B,QAAS,kBAGZ6zB,GAlBkBz0C,ICJfk1C,GAAQ,CACZhmE,KAAM,EACN0L,KAAM,GACNlK,GAAI,EACJmO,SAAU,EACVshD,MAAO,OACPnnD,MAAO,GACPN,MAAO,EACPC,OAAQ,GAGV,SAASw8D,GAAYC,GACnB1jE,OAAOC,KAAKujE,IAAOthE,KAAI,SAAA1G,QACFmC,IAAf+lE,EAAMloE,KACRkoE,EAAMloE,GAAOgoE,GAAMhoE,OAKzB,IAAMmoE,GAAO,CACXC,cAAaA,SAAEF,EAAOG,GACpB,GAAKA,EAAL,CAGA,IAAMr6D,EAAMlP,KAAKwpE,cAAcJ,EAAMlmE,KAAMkmE,EAAMv2D,UAC3C7F,EAAQo8D,EAAMp8D,OAAS,GAC7BA,EAAM6zB,KAAIzgC,GAAAA,OAAM8O,EAAI2xB,KAAO,KAC3B7zB,EAAMN,MAAKtM,GAAAA,OAAM8O,EAAIxC,MAAQ,KACtB5G,EAAAA,aAAa,YAAasjE,EAAMx6D,MAChC9I,EAAAA,aAAa,YAAasjE,EAAMlmE,MACnCgM,EAAI+xB,OACD76B,EAAAA,SAASmjE,EAAQ,QAEjBpiE,EAAAA,YAAYoiE,EAAQ,QAE3B7jE,OAAOC,KAAKqH,GAAOpF,KAAI,SAAA1G,GACd8L,EAAAA,MAAM9L,GAAO8L,EAAM9L,QAG9BuoE,SAAQ,WAAI,IAAArjD,EAAApmB,KACL0pE,KAAAA,QAAQ9hE,KAAI,SAAA/B,GACV8jE,EAAAA,UAAU9jE,GAAM,MAEvB7F,KAAK4pE,YAAa,GAQpBD,UAAS,SAAEP,GAAOS,IAAAA,IAAKlqE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,KAAAA,UAAA,GACb4zD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,IAGDsW,IACFV,GAAWC,GACNM,KAAAA,QAAQ/hE,KAAKyhE,IAEfppE,KAAK4pE,aAAcC,GAApB,CAGJ,IAAM36D,EAAMlP,KAAKwpE,cAAcJ,EAAMlmE,KAAMkmE,EAAMv2D,UAC3C7F,EAAQo8D,EAAMp8D,OAAS,GAC7BA,EAAM6zB,KAAIzgC,GAAAA,OAAM8O,EAAI2xB,KAAO,KAC3B7zB,EAAMN,MAAKtM,GAAAA,OAAM8O,EAAIxC,MAAQ,KAC7B,IAAIlH,EAASpF,UAAAA,OAAagpE,EAAM1kE,GAAkB,kBAClDwK,EAAI+xB,SAAWz7B,GAAa,SACtB2X,IAAAA,EAAKisD,EAAMU,SAAQ,kCAAA1pE,OAAqCgpE,EAAMU,SAAQ,UAAW,GACjFP,EAASzzD,EAAK9Q,UAAU,UAAWmY,EAAI,CAC3C,YAAaisD,EAAMx6D,KACnB,YAAaw6D,EAAMlmE,KACnB,UAAWkmE,EAAM1kE,IAChBc,GACHE,OAAOC,KAAKqH,GAAOpF,KAAI,SAAA1G,GACd8L,EAAAA,MAAM9L,GAAO8L,EAAM9L,MAE5BqyD,EAAS1X,OAAS0X,EAAS1X,MAAM5oC,YAAYs2D,GACxCQ,KAAAA,YAAYR,EAAQH,EAAM1kE,MAOjCslE,QAAO,SAAEtlE,GACP,GAAK1E,KAAK2U,OAAO+Z,QAAQ6kC,SAAzB,CAGA,IAAMrkD,EAAMlP,KAAK0pE,QAAQ1nD,QAAO,SAACyqB,EAAKrrC,GACpC,OAAOqrC,EAAI/nC,KAAOA,KAEpB,OAAOwK,EAAItP,OAAS,EAAIsP,EAAI,GAAK,OAQnC+6D,UAAS,SAAEb,GAAOc,IAAAA,EAAQvqE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,IAAAA,UAAA,GAChB4zD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,EAAL,CAGA,IAAM4W,EAAMnqE,KAAKgqE,QAAQZ,EAAM1kE,IAM3B,GALAylE,GACFzkE,OAAOC,KAAKyjE,GAAOxhE,KAAI,SAAA1G,GACrBipE,EAAIjpE,GAAOkoE,EAAMloE,MAGhBlB,KAAK4pE,WAAN,CAGEL,IAAAA,EAAShW,EAAS99B,KAAI,oBAAAr1B,OAAqBgpE,EAAM1kE,GAAE,OACpD6kE,IAGAD,KAAAA,cAAcF,EAAOG,GACtBW,GACGE,KAAAA,QAAQhB,EAAM1kE,QAQvB2lE,UAAS,SAAE3lE,GACT,IAAQglE,EAAY1pE,KAAZ0pE,QACAnW,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,EAAL,CAIA,IADA,IAAM+W,EAAM,GACH3oE,EAAI,EAAGA,EAAI+nE,EAAQ9pE,OAAQ+B,IAC9B+nE,EAAQ/nE,GAAG+C,KAAOA,GACpB4lE,EAAI3iE,KAAKhG,GAIb,IADA,IACSA,EADG2oE,EAAI1qE,OACG,EAAG+B,GAAK,EAAGA,IAE5B,GADQ0K,EAAAA,OAAOi+D,EAAI3oE,GAAI,GACnB3B,KAAK4pE,WAAY,CACnB,IAAML,EAAShW,EAAS99B,yBAAIr1B,OAAqBsE,EAAE,OAC/C6kE,GACKlM,EAAAA,cAAcx0C,YAAY0gD,MASzCgB,cAAa,WACHhX,IAAAA,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,EAGD,GAACvzD,KAAK4pE,WAAN,CAKJ,IADA,IAAMY,EAAUjX,EAASvgD,KAAKy3D,qBAAqB,WAC1C9oE,EAAI6oE,EAAQ5qE,OAAS,EAAG+B,GAAK,EAAGA,IAC9Bk6C,EAAAA,MAAMhzB,YAAY2hD,EAAQ7oE,IAErC3B,KAAK0pE,QAAU,QAPb1pE,KAAK0pE,QAAU,IAanBgB,cAAa,WAAe,IAAAhjD,EAAA1nB,KAAb2qE,EAAMhrE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACd4zD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,EAGD,GAACvzD,KAAK4pE,WAAN,CAIJ5pE,KAAK0pE,QAAU,GACf,IAAMc,EAAUjX,EAASvgD,KAAKy3D,qBAAqB,WAC7C7oE,EAAM4oE,EAAQ5qE,OAChBgC,GAAAA,EAAM+oE,EAAO/qE,OACf,IAAA,IAAS+B,EAAIC,EAAM,EAAGD,EAAIgpE,EAAO/qE,OAAS,EAAG+B,IAClCk6C,EAAAA,MAAMhzB,YAAY2hD,EAAQ7oE,IAGhCiE,EAAAA,SAAQ,SAACglE,EAAOxpE,GACjBA,EAAQQ,GACV4oE,EAAQppE,GAAO0E,aAAa,UAAS1F,GAAAA,OAAKwqE,EAAMlmE,KAC3CglE,EAAAA,QAAQ/hE,KAAKijE,GAClBljD,EAAKuiD,UAAUW,IAEfljD,EAAKiiD,UAAUiB,WAjBjB5qE,KAAK0pE,QAAUiB,GAsBnBE,aAAY,WAAI,IAAAljD,EAAA3nB,KACN0pE,EAAwB1pE,KAAxB0pE,QAASoB,EAAe9qE,KAAf8qE,WACT7lC,EAAajlC,KAAK2U,OAAlBswB,SACAsuB,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACHA,GAAYtuB,EAASv4B,QAAUo+D,EAAWp+D,QAG/Co+D,EAAWp+D,MAAQu4B,EAASv4B,MAC5Bo+D,EAAWjqC,KAAOoE,EAASpE,KACnBj7B,EAAAA,SAAQ,SAAAC,GACR0jE,IAAAA,EAAShW,EAAS99B,KAAI,oBAAAr1B,OAAqByF,EAAKnB,GAAE,OACxD6kE,GAAU5hD,EAAKoiD,YAAYR,EAAQ1jE,EAAKnB,SAI5CqlE,YAAWA,SAAER,EAAQ7kE,GACnB,IAAMqmE,EAAOj1D,EAAKhO,QAAQyhE,EAAQ,sBAClC,GAAKwB,EAAL,CAGA,IAAMC,EAAQhrE,KAAK8qE,WAEbG,EAAQ1B,EAAOhiC,wBACf8pB,EAAO0Z,EAAKxjC,wBACZ2jC,EAAQD,EAAMpqC,KAAOmqC,EAAMnqC,KAC3BsqC,EAAQH,EAAMt+D,MAAQw+D,EAAQD,EAAMv+D,MAAQ,EAClD,GAAIw+D,EAAQ7Z,EAAK3kD,MAAQ,GAAKs+D,EAAMt+D,MAAQ2kD,EAAK3kD,MAAO,CAChDuqB,IAAAA,EAAIo6B,EAAK3kD,MAAQ,EAAIw+D,EAC3BH,EAAK/9D,MAAM6zB,QAAIzgC,OAAM62B,EAAK,WACjBk0C,GAAAA,EAAQ9Z,EAAK3kD,MAAQ,EAAG,CACjC,IAAMuqB,EAAIk0C,EAAQ9Z,EAAK3kD,MAAQ,EAAIu+D,EAAMv+D,MAAQ,EACjDq+D,EAAK/9D,MAAM6zB,QAAIzgC,OAAM62B,EAAK,WAE1B8zC,EAAK/9D,MAAM6zB,KAAO,QAItBuX,eAAc,WAAI,IAAAxwB,EAAA5nB,KACRuzD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACHA,GAGevzD,KAAZ0pE,QACA9jE,SAAQ,SAAAC,GACR0jE,IAAAA,EAAShW,EAAS99B,KAAI,oBAAAr1B,OAAqByF,EAAKnB,GAAE,OACnD4kE,EAAAA,cAAczjE,EAAM0jE,OAI7B6B,cAAa,WACH7X,IAAAA,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,OAAKA,EAGWA,EAASvgD,KAAKy3D,qBAAqB,WAF1C,IAMXY,UAAS,SAAE3mE,GACD6uD,IAAAA,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,EAGL,OAAOA,EAAS99B,KAAI,oBAAAr1B,OAAqBsE,eCnPvC4mE,GAAe,CACnBC,SAAU,iBACVC,UAAW,sBACXC,QAAS,oBACTtY,MAAO,kBACPuY,UAAW,sBACX/d,WAAY,uBAIOge,YAAeprC,GAAAtkB,EAAA0vD,EAAAprC,GAAArkB,IAAAA,EAAAC,EAAAwvD,GAClC,SAAAA,EAAaxoE,GAAMijB,IAAAA,EAUhBA,OAVgBplB,OAAA2qE,GACN1jD,EAAAuY,EAAXtkB,EAAAA,EAAAzV,UAAMtD,IA8HM,eAAA,SAACwD,GACTyf,EAAK/mB,OAAOm2B,UAGZ1f,EAAKxP,SAASK,EAAEqD,OAAQ,oBAAsBoc,EAAK/mB,OAAOusE,qBAC5DxlD,EAAKzR,OAAO+Z,QAAQ6kC,SAASpyB,aAAax6B,IAGxCyf,EAAK4d,OAAO6nC,GAAK/1D,EAAKxP,SAASK,EAAEqD,OAAQ,sBAC3C8L,EAAKtM,MAAM7C,GACXA,EAAE+I,uBAELuY,EAAAuY,EAAApa,GAEa,eAAA,SAACzf,GACTyf,EAAK/mB,OAAOm2B,UAGZpP,EAAK4d,OAAO6nC,GAAK/1D,EAAKxP,SAASK,EAAEqD,OAAQ,sBAC3C8L,EAAKtM,MAAM7C,GACXA,EAAE+I,sBAELuY,EAAAuY,EAAApa,GAEW,aAAA,SAACzf,GACP,GAACyf,EAAK0lD,OAAN,CAGIvY,IAAAA,EAAantC,EAAKzR,OAAO+Z,QAAzB6kC,SACJA,GAAYA,EAASpgD,MACvBogD,EAASlZ,UAAU1zC,IAClB4sD,EAASpgD,IAAIynC,SAAW2Y,EAASpyB,aAAax6B,QAElDshB,EAAAuY,EAAApa,GAEiB,mBAAA,SAACzf,GACbyf,IAAAA,EAAK/mB,OAAOm2B,QAAZpP,CAGJA,EAAK2lD,QAAQ3jD,oBAAoB,aAAchC,EAAK4lD,iBAC/CC,EAAAA,QAAQtlE,EAAEqD,QACfoc,EAAK2lD,QAAU,KACPxY,IAAAA,EAAantC,EAAKzR,OAAO+Z,QAAzB6kC,SACRA,GAAYA,EAAS2Y,aACrB9lD,EAAK7X,WACN0Z,EAAAuY,EAAApa,0BAEqB,SAACwE,EAAMjkB,GACvByf,IAAAA,EAAK/mB,OAAOm2B,SAGZ1f,EAAKxP,SAASK,EAAEqD,OAAQ,mBAAqBoc,EAAK2lD,QAAS,CAC7D3lD,EAAK2lD,QAAUplE,EAAEqD,OACZmiE,EAAAA,SAASxlE,EAAEqD,QACZoc,EAAK2lD,QAAQ5lE,SAASvG,OAAS,GACjCwmB,EAAK/X,OAECklD,IAAAA,EAAantC,EAAKzR,OAAO+Z,QAAzB6kC,SACRA,GAAYA,EAAS6Y,cACrBhmD,EAAK2lD,QAAQ7jD,iBAAiB,aAAc9B,EAAK4lD,qBAxLnD5lD,EAAKsjD,QAAU,GACftjD,EAAKimD,aAAe,KACpBjmD,EAAKkmD,eAAiB,KACtBlmD,EAAKuZ,UAAY,KACjBvZ,EAAK84B,QAAU,GACf94B,EAAK4d,OAAS,CACZjgC,IAAK,EACL8nE,GAAG,GACJzlD,EAyBFulD,OAxBA1qE,EAAA0qE,EAAA,CAAA,CAAAzqE,IAAA,eAAAC,MA0BD,SAAcgC,GACNowD,IAAAA,EAAWpwD,EAAKwR,OAAO+Z,QAAQ6kC,SACjCA,IACFpwD,EAAK6P,KAAOugD,EAASvgD,QAExB,CAAA9R,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACbA,KAAK+rE,QAAU,KACf/rE,KAAKusE,iBAAmBvsE,KAAKwtB,KAAK,aAAa,SAACg/C,EAAQ5hD,GAClDA,EAAK2uB,UACF5kC,EAAAA,OAAOkpC,KAAKjzB,EAAK2uB,aAG1Bv5C,KAAKysE,kBAAoBzsE,KAAKwtB,KAAK,iBAAiB,SAACtqB,GACnDwkB,EAAKglD,eAAe52D,EAAK7M,OAAO/F,ODwLvB,SAAsByrB,GACnC,IAAQtvB,EAAmBsvB,EAAnBtvB,OAAQsV,EAAWga,EAAXha,OAChBjP,OAAOC,KAAK0jE,IAAMzhE,KAAI,SAAA/B,GACpB8oB,EAAO9oB,GAAQwjE,GAAKxjE,GAAMoG,KAAK0iB,MAEjC,IAAMg+C,EAASh4D,EAAOtV,OAAOutE,aAAevtE,EAAOstE,QAAU,GAC7Dh+C,EAAO+6C,QAAUiD,EAAO/kE,KAAI,SAAA/B,GAEnBA,OADPsjE,GAAWtjE,GACJA,KAET8oB,EAAOi7C,YAAa,EACpBj7C,EAAOm8C,WAAa,CAClBjqC,KAAMlsB,EAAOswB,SAASpE,KACtBn0B,MAAOiI,EAAOswB,SAASv4B,OAElB6O,EAAAA,GAAG9B,GAAwB,WAC3BkV,EAAOi7C,WAIVj7C,EAAOypB,iBAHPzpB,EAAO86C,cAMJluD,EAAAA,GAAG9B,IAAqB,WAC7BkV,EAAOk8C,kBC9MPgC,CAAY7sE,MAEPub,KAAAA,GAAG9B,GAAwB,WAC9BiO,EAAKnZ,UAEHvO,KAAKX,OAAOm2B,SACdx1B,KAAKw1B,UAGFs3C,KAAAA,YAAc9sE,KAAKy1B,KAAK,uBAC9B,CAAAv0B,IAAA,YAAAC,MAED,SAAW9B,GAAQ,IAAAsoB,EAAA3nB,KACZX,GAGLqG,OAAOC,KAAKtG,GAAQuI,KAAI,SAAA1G,GACjB7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,QAE7B,CAAAA,IAAA,iBAAAC,MAED,WACqBnB,KAAX2U,OACI+Z,QAAQ6kC,WAGfwZ,KAAAA,YAAc/sE,KAAKy1B,KAAK,iBACxBu3C,KAAAA,UAAYhtE,KAAKy1B,KAAK,4BACtBw3C,KAAAA,SAAWjtE,KAAKy1B,KAAK,iBACrBy3C,KAAAA,QAAUltE,KAAKy1B,KAAK,oBAEzBz1B,KAAKmtE,cAAe,EAEpBntE,KAAK4yD,oBAEL5yD,KAAKotE,gBACN,CAAAlsE,IAAA,aAAAC,MAED,WAAc,IAAAymB,EAAA5nB,KACJuzD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACR,GAAKA,IAGL7tD,OAAOC,KAAK2lE,IAAc1jE,KAAI,SAAA1G,GAC5B0mB,EAAK0jD,GAAapqE,IAAQ0mB,EAAK0jD,GAAapqE,IAAM+K,KAAK2b,GACvD2rC,EAASC,YAAYtyD,EAAK0mB,EAAK0jD,GAAapqE,QAGvB,WAAnBimB,GAAQhG,QAAZ,CAEAnhB,KAAKiM,KAAK,gBAAiB,YAAajM,KAAKqtE,aAE7CrtE,KAAKiM,KAAK,gBAAiB,YAAajM,KAAKstE,aAE7CttE,KAAKiM,KAAK,gBAAiB,UAAWjM,KAAKutE,WAE3C,IAAMphE,EAAMnM,KAAKwtB,KAAK,gBAAgB,eAIjCggD,KAAAA,oBAAsB,SAAC7mE,GAC1BA,EAAE+I,kBACE7B,EAAAA,SAA2B,IAAlB+Z,EAAKoc,OAAOjgC,IAAY,IAAM,IAAM4C,GAE7C4sD,GAEFA,EAASlZ,UAAU1zC,IAIvB3G,KAAKiM,KAAK,mBAAoB,UAAWjM,KAAKwtE,wBAC/C,CAAAtsE,IAAA,iBAAAC,MAiED,SAAgBypB,EAAMjkB,IAChB3G,KAAKX,OAAOm2B,SAAYx1B,KAAK2U,OAAO9B,UAGnC46D,KAAAA,eAAe7iD,EAAKvW,OAAQuW,EAAKle,MAAOke,EAAK1W,YAAa0W,EAAKjkB,KACrE,CAAAzF,IAAA,sBAAAC,MAED,SAAqBypB,IACf5qB,KAAKX,OAAOm2B,SAAYx1B,KAAK2U,OAAO9B,WAGxC7S,KAAK8rE,QAAS,EACd9rE,KAAKqsE,cAAgBv2D,EAAK1P,SAASpG,KAAKqsE,aAAc,WACvD,CAAAnrE,IAAA,oBAAAC,MAED,SAAmBypB,IACb5qB,KAAKX,OAAOm2B,SAAYx1B,KAAK2U,OAAO9B,WAGxC7S,KAAK8rE,QAAS,EACd9rE,KAAKqsE,cAAgBv2D,EAAK3O,YAAYnH,KAAKqsE,aAAc,WAC1D,CAAAnrE,IAAA,kBAAAC,MAED,SAAiBypB,EAAMjkB,GACjB3G,KAAKX,OAAOm2B,SAGZ1f,EAAKxP,SAASK,EAAEqD,OAAQ,mBAC1BrD,EAAE+I,kBACF/I,EAAEutC,iBACF,CAAC,OAAQ,KAAM,QAAQtsC,KAAI,SAAA1G,GACzB0pB,EAAK1pB,GAAOyF,EAAEqD,OAAOnD,aAAYzG,QAAAA,OAASc,OAE5C0pB,EAAK1nB,OAAS0nB,EAAK1nB,KAAOozB,OAAO1L,EAAK1nB,OACjCqpE,KAAAA,iBAAiB5lE,EAAGikB,MAE5B,CAAA1pB,IAAA,gBAAAC,MAED,SAAekT,EAAQq5D,GACb16D,IAAAA,EAAsChT,KAAtCgT,KAAM+5D,EAAgC/sE,KAAhC+sE,YAAap4D,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OAE7BsuE,EAAkB,SADPh5D,EAAO6R,SAAhBiQ,KAEJm3C,EAAS56D,EAAKu0B,wBAAwB76B,MAEtC,GAACkhE,IAAU5tE,KAAKmtE,aAAhB,CAIAr8D,IACAqM,EADArM,EAAIuD,GADRu5D,EAAS5tE,KAAKmtE,cAAgBS,EAASvuE,EAAOqN,MAAQrN,EAAOqN,MAAQkhE,GAC3C,EAEtB98D,EAAI,IAAM68D,GACR78D,EAAA,EACJqM,EAAK9I,EAASu5D,EAAS,GACd98D,EAAI48D,EAASE,IAAWD,GACjCxwD,EAAKrM,GAAK48D,EAASE,GACnB98D,EAAI48D,EAASE,GAERzwD,EAAA,OAEA9Z,IAAAA,IAAc0pE,EAAY//D,MAAM+iC,UAAS,cAAA3vC,OAAiB+c,EAAGugC,QAAQ,WACvE1wC,EAAAA,MAAM+iC,UAAS3vC,cAAAA,OAAiB0Q,EAAE4sC,QAAQ,GAAqB,wBACrE,CAAAx8C,IAAA,iBAAAC,MAED,SAAgB+9C,GACd,IAAQ+tB,EAAwBjtE,KAAxBitE,SAAUD,EAAchtE,KAAdgtE,UAClBC,EAASxnE,UAAYy5C,GACpBl/C,KAAK2/B,YAAcqtC,EAAUvnE,UAAYy5C,KAC3C,CAAAh+C,IAAA,iBAAAC,MAED,SAAgBkT,EAAQq5D,EAAQxqE,EAAMyD,GACpC,IAAQqM,EAAyBhT,KAAzBgT,KAAM3T,EAAmBW,KAAnBX,OAAQ2kC,EAAWhkC,KAAXgkC,OACtB,GAAKhxB,EAAL,CAMAgxB,EAAOjgC,IAAMb,EACblD,KAAKysE,kBAAkBvpE,GACvB,IAAMg8C,EAAUl/C,KAAKk/C,QACjBv4C,GAAKA,EAAEqD,QAAU8L,EAAKxP,SAASK,EAAEqD,OAAQ,kBAC3ChK,KAAK6tE,SAASlnE,EAAEqD,OAAOnD,aAAa,cAAc,EAAOq4C,GACpDitB,KAAAA,SAASxlE,EAAEqD,QAChBg6B,EAAO6nC,GAAI,EACJiC,EAAAA,aAAe9pC,EAAO6nC,IAAM7nC,EAAOjgC,IAAM8J,SAASlH,EAAEqD,OAAOnD,aAAa,aAAc,MACpFxH,EAAO0uE,aAChB/pC,EAAO6nC,GAAI,EACX7rE,KAAK6tE,SAASxuE,EAAO0uE,aAAa,EAAM7uB,KAExClb,EAAO6nC,GAAI,EACX7rE,KAAKguE,SAAS,KAGhBhuE,KAAKiuE,eAAe/uB,GACfmW,KAAAA,iBAAiBrxB,EAAOjgC,KACxBmqE,KAAAA,cAAc75D,EAAQq5D,MAG7B,CAAAxsE,IAAA,iBAAAC,MAIA,SAAgBqH,GACdxI,KAAKk/C,QAAU12C,IAChB,CAAAtH,IAAA,mBAAAC,MAED,SAAkB+B,GAChB,IAAQyR,EAAiC3U,KAAjC2U,OAAQ03D,EAAyBrsE,KAAzBqsE,aAAchtE,EAAWW,KAAXX,OACtBsgC,EAAchrB,EAAO+Z,QAArBiR,UACJA,GAAAA,GAAaA,EAAU+zB,OAAQ,CAC5B/zB,KAAAA,WAAaA,EAAUkT,OAAO7yC,KAAK2/B,UAAWz8B,EAAM7D,EAAOqN,MAAOrN,EAAOsN,QACxE0kD,IAAAA,EAAOgb,GAAgBA,EAAa9kC,wBACrC+kC,KAAAA,gBAAkB3sC,EAAUkT,OAAO7yC,KAAKssE,eAAgBppE,EAAMmuD,EAAK3kD,MAAO2kD,EAAK1kD,WAEvF,CAAAzL,IAAA,oBAAAC,MAED,WAAmBgtE,IAAAA,EAAexuE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC/BwnB,GAAmB,WAAnBA,GAAQhG,OAARgG,CAGJ,IAAQxS,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OACVsgC,EAAYhrB,EAAO+b,UAAU,aAInC,GAHIiP,GACFA,EAAUwQ,UAAUg+B,GAEjBxuC,GAAcA,EAAU+zB,QAAWr0D,EAAO+uE,gBAA/C,CAIOjnE,EAAAA,YAAYnH,KAAKgT,KAAM,2BAEV,UAAhB3T,EAAOo3B,MACJrwB,EAAAA,SAASpG,KAAKgT,KAAM,cAE3BhT,KAAKmtE,cAAe,EACdkB,IAAAA,EAAQruE,KAAKy1B,KAAK,sBACxBz1B,KAAK2/B,UAAYA,EAAUg0B,gBAAgB0a,EAAO,sBAC9ChvE,EAAOivE,qBACTtuE,KAAKqsE,aAAev2D,EAAK9Q,UAAU,mBAAoB,GAAI,GAAI,mBACxDgO,EAAAA,KAAKC,YAAYjT,KAAKqsE,cAC7BrsE,KAAKssE,eAAiB3sC,EAAUg0B,gBAAgB3zD,KAAKqsE,aAAc,sBAErErsE,KAAKq1D,iBAAiB,QAhBfjvD,EAAAA,SAASpG,KAAKgT,KAAM,8BAiB5B,CAAA9R,IAAA,gBAAAC,MAED,SAAe+B,EAAM2P,GACX0gD,IAAAA,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACA5+C,EAAW3U,KAAX2U,OACF45D,EAAahb,EAASvgD,KAAKu0B,wBAAwB76B,MACnD8hE,EAAkB75D,EAAO9B,SAAW07D,EAAa,EAQhD,OANHrrE,EAAO2P,EAAW8B,EAAO9B,WAC3BA,EAAW8B,EAAO9B,SAAW3P,GAEbyR,EAAO9B,SACF8B,EAAO9B,SAEvB,CACLguB,KAAM39B,EAAOyR,EAAO9B,SAAW,IAC/BnG,MAAOmG,EAAW8B,EAAO9B,SAAW,IACpCouB,OAAQpuB,EAAW27D,KAEtB,CAAAttE,IAAA,UAAAC,MAED,SAASuD,GACDylE,IAAAA,EAAMnqE,KAAKgqE,QAAQtlE,GACzB,GAAIylE,EAAK,CACD9Y,IACE3kD,EADK1M,KAAKgT,KAAKu0B,wBACf76B,MACF2H,EAAS81D,EAAIjnE,KAAOlD,KAAK2U,OAAO9B,SAAWnG,EACjD1M,KAAKytE,eAAep5D,EAAQ3H,EAAOy9D,EAAIjnE,SAE1C,CAAAhC,IAAA,WAAAC,MAED,SAAU6I,EAAQtF,GACXsF,IAGAtF,IACEsF,EAAAA,EAAOnD,aAAa,YAEtBT,EAAAA,SAAS4D,EAAQ,UACtBhK,KAAKyuE,aAAe/pE,KACrB,CAAAxD,IAAA,UAAAC,MAED,SAAS6I,GACP,IAAKA,EAAQ,CACX,IAAMtF,EAAK1E,KAAKyuE,aACPzkE,EAAAhK,KAAKqrE,UAAU3mE,GAErBsF,IAGA7C,EAAAA,YAAY6C,EAAQ,UACzBhK,KAAKyuE,aAAe,QACrB,CAAAvtE,IAAA,WAAAC,MAED,SAAUyN,EAAM8/D,GAAWxvB,IAAAA,EAAOv/C,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GAC9ByG,EAAAA,SAASpG,KAAKgT,KAAM,gBACpBpE,IAGLkH,EAAK1P,SAASpG,KAAKy1B,KAAK,oBAAqB,aACzCi5C,GAAkC,eAArB1uE,KAAKX,OAAOo3B,MACtBrwB,EAAAA,SAASpG,KAAKgT,KAAM,WACzBhT,KAAKktE,QAAQ7Q,YAAcztD,IAEtBzH,EAAAA,YAAYnH,KAAKgT,KAAM,WACvBk6D,KAAAA,QAAQ7Q,YAAcr8D,KAAKmtE,aAAev+D,EAAI,GAAAxO,OAAM8+C,OAAO9+C,OAAIwO,OAEvE,CAAA1N,IAAA,WAAAC,MAED,WACOgG,EAAAA,YAAYnH,KAAKgT,KAAM,gBAC5BhT,KAAKktE,QAAQ7Q,YAAc,GAC3BvmD,EAAK3O,YAAYnH,KAAKy1B,KAAK,oBAAqB,aAC3CtuB,EAAAA,YAAYnH,KAAKgT,KAAM,aAC7B,CAAA9R,IAAA,OAAAC,MAED,WACOiF,EAAAA,SAASpG,KAAKgT,KAAM,UAG3B,CAAA9R,IAAA,OAAAC,MAIA,SAAMA,GACCgG,EAAAA,YAAYnH,KAAKgT,KAAM,UAC7B,CAAA9R,IAAA,SAAAC,MAED,WACE,IAAQ9B,EAAyBW,KAAzBX,OAAQuwB,EAAiB5vB,KAAjB4vB,aAChB5vB,KAAKX,OAAOm2B,SAAU,EACtBx1B,KAAKuO,QACAvO,KAAK2/B,WAAatgC,EAAO+uE,iBAC5BpuE,KAAK4yD,kBAAkBhjC,EAAa+P,WAAa,MAEpD,CAAAz+B,IAAA,UAAAC,MAED,WACEnB,KAAKX,OAAOm2B,SAAU,EACtBx1B,KAAKqO,SACN,CAAAnN,IAAA,UAAAC,MAED,WAAW,IAAAgnB,EAAAnoB,KACDuzD,EAAavzD,KAAK2U,OAAO+Z,QAAzB6kC,SACRA,GAAY7tD,OAAOC,KAAK2lE,IAAc1jE,KAAI,SAAA1G,GACxCqyD,EAASob,eAAeztE,EAAKinB,EAAKmjD,GAAapqE,QAEjDlB,KAAKssE,eAAiB,KACtBtsE,KAAK2/B,UAAY,KACjB3/B,KAAKqsE,cAAgBrsE,KAAK2U,OAAO3B,KAAK6V,YAAY7oB,KAAKqsE,cACvDrsE,KAAKshC,OAAO,gBAAiB,YAAathC,KAAKqtE,aAC/CrtE,KAAKshC,OAAO,gBAAiB,YAAathC,KAAKstE,aAC/CttE,KAAKshC,OAAO,gBAAiB,UAAWthC,KAAKutE,WAC7CvtE,KAAKshC,OAAO,mBAAoB,UAAWthC,KAAKwtE,uBACjD,CAAAtsE,IAAA,SAAAC,MAED,WACE,MAAuB,WAAnBgmB,GAAQhG,QAAkE,WAA3CnhB,KAAK4vB,aAAa2N,qBAC5C,GAGT,iCAAAn9B,OAA6D,UAArBJ,KAAKX,OAAOo3B,KAAmB,aAAe,GAAE,0YAWzF,CAAA,CAAAv1B,IAAA,aAAAK,IApcD,WACS,MAAA,oBAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLH,MAAO,EACPwtE,UAAW,EACXjC,OAAQ,GACRoB,YAAa,GACbD,aAAa,EACblC,sBAAsB,EACtBwC,iBAAiB,EACjBE,oBAAoB,EACpB73C,KAAM,GACNjB,SAAS,EACT9oB,MAAO,IACPC,OAAQ,QAEXg/D,GApC0C33C,IClBxB66C,YAAS56C,GAAAhY,EAAA4yD,EAAA56C,GAAA/X,IAAAA,EAAAC,EAAA0yD,GAuB5B,SAAAA,EAAa1rE,GAAMijB,IAAAA,EAIKA,OAJLplB,OAAA6tE,IACjB3yD,EAAAA,EAAAzV,UAAMtD,IACD2rE,MAAQ,EACb1oD,EAAK2iD,SAAW,KAChB3iD,EAAK2oD,aAAe,GAAE3oD,EANvByoD,OAOA5tE,EAAA4tE,EAAA,CAAA,CAAA3tE,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACTA,KAAK0zD,QACP1zD,KAAKgvE,gBAEPhvE,KAAKub,GAAG,CAAC9B,IAAyB,WAChC,IAAAw1D,EAA8BvnD,EAAKroB,OAA3B6vE,EAAOD,EAAPC,QAASnG,EAAQkG,EAARlG,SACjBrhD,EAAKgsC,SAAWhsC,EAAKqhD,SAAWA,EAAW,EAAIA,EAAW5kE,KAAKgF,MAA6B,IAAvBue,EAAK/S,OAAO9B,SAAkBq8D,GAAW,UAEjH,CAAAhuE,IAAA,YAAAC,MAED,SAAW9B,GAAQ,IAAAsoB,EAAA3nB,KACjB,GAAKX,EAAL,CAGMsG,IAAAA,EAAOD,OAAOC,KAAKtG,GACrBsG,EAAK/F,OAAS,IAGbgG,EAAAA,SAAQ,SAAA1E,GACN7B,EAAAA,OAAO6B,GAAO7B,EAAO6B,MAEvBwyD,KAAAA,QAAU1zD,KAAKgvE,oBACrB,CAAA9tE,IAAA,SAAAK,IAED,WACE,IAAAq/B,EAA0B5gC,KAAKX,OAAvBgpB,EAAIuY,EAAJvY,KAAM6mD,EAAOtuC,EAAPsuC,QACd,OAAO7mD,GAAQA,EAAKzoB,OAAS,GAAKsvE,EAAU,IAC7C,CAAAhuE,IAAA,gBAAAC,MAED,WACE,IAAAogC,EAA6CvhC,KAAKX,OAA1CqN,EAAK60B,EAAL70B,MAAOC,EAAM40B,EAAN50B,OAAQuiE,EAAO3tC,EAAP2tC,QAASnG,EAAQxnC,EAARwnC,SAC3B+F,KAAAA,MAAQpiE,EAAQC,EAAS,IAC9B3M,KAAK+oE,SAAWA,GAAY5kE,KAAKgF,MAAMnJ,KAAK2U,OAAO9B,SAAWq8D,GAC9DlvE,KAAK+uE,aAAe,KAUrB,CAAA7tE,IAAA,gBAAAC,MAED,SAAeC,GACNA,OAAAA,GAAS,GAAKA,EAAQpB,KAAKX,OAAOgpB,KAAKzoB,OAASI,KAAKX,OAAOgpB,KAAKjnB,GAAS,KAClF,CAAAF,IAAA,UAAAC,MAED,SAASC,GAAO,IAAAwmB,EAAA5nB,KACV,IAAAA,KAAK+uE,aAAa3tE,GAAlB,CAGIinB,IAAAA,EAASroB,KAAKX,OAAdgpB,KACFzmB,EAAMymB,EAAKzoB,OACXiP,EAAM,GACZzN,EAAQ,GAAKyN,EAAIlH,KAAKvG,EAAQ,GAC9ByN,EAAIlH,KAAKvG,GACTA,EAAQ,GAAKA,EAAQQ,EAAM,GAAKiN,EAAIlH,KAAKvG,EAAQ,GAC7CwG,EAAAA,KAAI,SAAA/B,IACD+hB,EAAKmnD,aAAalpE,IAASA,GAAQ,GAAKA,EAAOjE,IAClDgmB,EAAKmnD,aAAalpE,GAAQ,EACrBwJ,EAAAA,WAAWgZ,EAAKxiB,IAAO,WAC1B+hB,EAAKmnD,aAAalpE,GAAQ,YAIjC,CAAA3E,IAAA,cAAAC,MAED,SAAa4C,GAAKorE,IAAAA,EAAcxvE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAAGyvE,EAAezvE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EACtDwnC,EAA6CnnC,KAAKX,OAA1C6vE,EAAO/nC,EAAP+nC,QAASG,EAAGloC,EAAHkoC,IAAKC,EAAGnoC,EAAHmoC,IAAK5iE,EAAKy6B,EAALz6B,MAAOC,EAAMw6B,EAANx6B,OAClC3M,KAAK+oE,SAAW5kE,KAAKgF,MAAMnJ,KAAK2U,OAAO9B,SAAWq8D,GAClD,IAAI9tE,EAAQ+C,KAAK0E,KAAK9E,EAAM/D,KAAK+oE,UAE3BwG,GADNnuE,EAAQA,EAAQ8tE,EAAUA,EAAU9tE,GACXiuE,EAAMC,EAAM,EAAKnrE,KAAK0E,KAAKzH,GAASiuE,EAAMC,IAAQ,EACrEE,EAAcpuE,EAAQmuE,GAAYD,EAAMD,GACxCI,EAAWD,EAAc,EAAIrrE,KAAK0E,KAAK2mE,EAAcF,GAAO,EAAI,EAChEI,EAAWF,EAAc,EAAIA,EAAcC,EAAWH,EAAM,EAAI,EAClEK,EAAS,EACTC,EAAU,EAGd,GAAIT,GAAkBC,EAAiB,CACrC,IAAMz3B,EAAMw3B,EAAiBC,EACzBz3B,EAAMjrC,EAAQC,EAEhBgjE,GADUP,EAAAA,IACU1iE,EAAQC,GAK5BijE,GADST,EAAAA,IACWziE,EAAQC,QAEpByiE,EAGAD,IAEVQ,GADAC,EAAUR,GAAmBziE,IACTD,EAAQC,IAH5BijE,GADAD,EAASR,GAAkBziE,IACPA,EAAQC,GAKxB1B,IAAAA,EAAMjL,KAAK6vE,cAAcN,GACxB,MAAA,CACLA,SAAAA,EACAE,SAAAA,EACAC,SAAAA,EACAzkE,IAAAA,EACA0B,OAAQijE,EACRljE,MAAOijE,EACP3iE,MAAO,CACL9B,gBAAe9K,OAAAA,OAAS6K,EAAM,KAC9BmC,kBAAchN,OAAKuvE,EAASL,EAAY,WACxCQ,mBAAkB1vE,IAAAA,OAAMsvE,EAAWC,EAAMvvE,QAAAA,OAAOqvE,EAAWG,EAAW,MACtEljE,MAAKtM,GAAAA,OAAKuvE,EAAU,MACpBhjE,OAAM,GAAAvM,OAAKwvE,EAAO,UAGvB,CAAA1uE,IAAA,SAAAC,MAED,SAAQkE,EAAKtB,GAAKorE,IAAAA,EAAcxvE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAAGyvE,EAAezvE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,EAAGowE,EAAWpwE,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACvEgrC,EAA0B3qC,KAAKX,OAAvB6vE,EAAOvkC,EAAPukC,QAAS7mD,EAAIsiB,EAAJtiB,KACjB,KAAI6mD,GAAW,IAAM7mD,GAAwB,IAAhBA,EAAKzoB,OAAlC,CAGA,IAAMuT,EAAMnT,KAAKgwE,YAAYjsE,EAAKorE,EAAgBC,GAC7CjlD,KAAAA,QAAQhX,EAAIo8D,UAEjB7pE,OAAOC,KAAKwN,EAAInG,OAAOpF,KAAI,SAAC1G,GACtB8L,EAAAA,MAAM9L,GAAOiS,EAAInG,MAAM9L,MAE7BwE,OAAOC,KAAKoqE,GAAanoE,KAAI,SAAA1G,GACvB8L,EAAAA,MAAM9L,GAAO6uE,EAAY7uE,SAIjC,CAAAA,IAAA,eAAAC,MACA,WAAc02D,IAAAA,EAASl4D,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAG,GACxBK,KAAKmwC,UAAU0nB,KAChB,CAAA32D,IAAA,kBAAAC,MAED,SAAiB6R,EAAMxN,GACfH,IAAAA,EAAMyQ,EAAK9Q,UAAU,eAAgB,GAAI,GAAE,aAAA5E,OAAeoF,IAEzDH,OADC2N,GAAAA,EAAKC,YAAY5N,GAClBA,KACR,CAAA,CAAAnE,IAAA,aAAAK,IA5KD,WACS,MAAA,cAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACL8wB,QAAQ,EACRhK,KAAM,GACN6mD,QAAS,EACTI,IAAK,EACLD,IAAK,EACL1iE,OAAQ,GACRD,MAAO,IACP0G,MAAO,EACP5N,UAAW,GACXihE,cAAc,OAEjBoI,GArBoCt/C,ICfvC,SAAS0gD,GAAY9b,GACnB,OAAOA,EAAK/zD,cAAAA,OAAiB+zD,OAAW,GAGpC+b,IAAAA,YAAY3vC,GAAAtkB,EAAAi0D,EAAA3vC,GAAArkB,IAAAA,EAAAC,EAAA+zD,GAAA,SAAAA,IAAA9pD,IAAAA,EAAAplB,OAAAkvE,GAAA,IAAA,IAAAxwE,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAqCfqmB,OArCe6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,qBA+BD,WACLkS,IAAAA,EAAU+Q,EAAKzR,OAAfU,MACAomC,EAARjb,EAAApa,GAAQq1B,eACJv4C,EAAOkjB,EAAKlS,YAChBhR,EAAO4S,EAAKlD,qBAAqB1P,EAAMu4C,EAAgBpmC,GACvD+Q,EAAKysB,OAAO,CAAE3oB,OAAQhnB,GAAQu4C,MAC/Br1B,EA3BA8pD,OA2BAjvE,EAAAivE,EAAA,CAAA,CAAAhvE,IAAA,iBAAAK,IAzBD,WACE,OAAOvB,KAAK4vB,aAAa6P,gBAAkBz/B,KAAK2U,OAAO8mC,gBAAkBz7C,KAAK2U,OAAO9B,WACtF,CAAA3R,IAAA,cAAAK,IAED,WACE,IAAA2uB,EAA2ClwB,KAAK2U,OAAxC+mC,EAAiBxrB,EAAjBwrB,kBAAmBxnC,EAAWgc,EAAXhc,YACpBwnC,OAAAA,GAAqB,EAAIA,EAAoBxnC,IACrD,CAAAhT,IAAA,cAAAC,MAED,WAAe,IAAAumB,EAAA1nB,KACRA,KAAKgT,OAGLuI,KAAAA,GAAG9B,EAAoBzZ,KAAKm8C,cAC5B5gC,KAAAA,GAAG9B,GAAgB,WACtBiO,EAAKk0B,cAER,CAAA16C,IAAA,QAAAC,MAUD,WACEnB,KAAK6yC,OAAO,CAAE3oB,OAAQ,EAAGiuB,OAAQ,GAAK,KACvC,CAAAj3C,IAAA,SAAAC,MAED,WAAQypB,IAAAA,EAAIjrB,UAAAC,OAAAD,QAAA0D,IAAA1D,UAAA0D,GAAA1D,UAAG,GAAA,CAAEw4C,OAAQ,EAAGjuB,OAAQ,GAAKrX,EAAQlT,UAAAC,OAAAD,EAAAA,kBAAA0D,EAC1CwP,GAAa7S,KAAKgT,OAGnB4X,EAAKutB,SACF1iB,KAAAA,KAAK,0BAA0BzoB,MAAMN,SAAKtM,OAAMwqB,EAAKutB,OAAStlC,EAAW,IAAM,MAElF+X,EAAKV,SACFuL,KAAAA,KAAK,2BAA2BzoB,MAAMN,SAAKtM,OAAMwqB,EAAKV,OAASrX,EAAW,IAAM,SAExF,CAAA3R,IAAA,SAAAC,MAED,WACE,IAAAo/C,EAAsCvgD,KAAK4vB,aAAnCkQ,EAAWygB,EAAXzgB,YACR,GADiCygB,EAAZhiB,aACrB,CAGA,IAAAqC,EAAyB5gC,KAAKX,OAAtBo3B,EAAImK,EAAJnK,KAAM9pB,EAAMi0B,EAANj0B,OACRikC,EAAS,CACbuH,OAAQ83B,GAAWnwC,EAAYG,aAC/B/V,OAAQ+lD,GAAWnwC,EAAYE,aAC/BuzB,SAAU0c,GAAWnwC,EAAYC,eACjCpzB,OAAQA,EAAS,GAAgB,IAAXA,EAAYvM,WAAAA,OAAcuM,EAAc,OAAA,IAGhEvM,MAAAA,6CAAAA,OAD4B,SAATq2B,EAAkB,wBAA0B,GACDr2B,aAAAA,OAAYwwC,EAAO2iB,SAAQnzD,KAAAA,OAAIwwC,EAAOjkC,OAAM,0EAAAvM,OAC1CwwC,EAAOuH,OAAM,qGAAA/3C,OACXwwC,EAAO1mB,OAAM,6DAEhF,CAAA,CAAAhpB,IAAA,aAAAK,IAvED,WACS,MAAA,iBACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLk1B,KAAM,OACN9pB,OAAQ,OAEXujE,GAVwBl8C,ICFrBm8C,GACO,WADPA,GAES,aAFTA,GAII,SAGV,SAASC,KACH,IACF,OAAOviE,SAASlP,OAAO0T,YAAYtO,MAAO,UACnC4C,GACA,OAAA,IAAI7C,MAAOsO,WAiCtB,IAAIi+D,GAAkB,KAChBC,YAAS/vC,GAAAtkB,EAAAq0D,EAAA/vC,GAAArkB,IAAAA,EAAAC,EAAAm0D,GAAA,SAAAA,IAAAlqD,IAAAA,EAAAplB,OAAAsvE,GAAA,IAAA,IAAA5wE,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAyTZqmB,OAzTY6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAuJE,gBAAA,SAACwD,GACTyf,EAAKzR,SACL47D,EAAAA,YAAcnqD,EAAK/mB,OAAOmxE,gBAC/BpqD,EAAKqqD,OACLrqD,EAAKsqD,mBAAmB/pE,GACnB8U,EAAAA,IAAIhC,EAAoB2M,EAAKsqD,oBAC7Bn1D,EAAAA,GAAG9B,EAAoB2M,EAAKsqD,wBAClCzoD,EAAAuY,EAAApa,GAEoB,sBAAA,SAACzf,GACa,YAA7BrB,SAASqrE,gBACNC,EAAAA,oBAAsBxqD,EAAK/kB,QACM,WAA7BiE,SAASqrE,iBAClBvqD,EAAKqqD,UAERxoD,EAAAuY,EAAApa,GAoFoB,sBAAA,SAACzf,GAChByf,GAAAA,EAAKmqD,YAAc,EACrBnqD,EAAKyqD,aACAN,EAAAA,kBACA,CACLnqD,EAAK0qD,WAAY,EACZr1D,EAAAA,IAAIhC,EAAoB2M,EAAKsqD,oBAC1BK,IAAAA,EAAkB3qD,EAAK/mB,OAAvB0xE,eACP3qD,EAAKzR,OAAO0Q,QAAUe,EAAKwqD,oBAAsBxqD,EAAK/kB,MAAM,EAAG0vE,OAEnE9oD,EAAAuY,EAAApa,YAsBO,SAACljB,EAAM6lE,GACPn3D,IAAAA,EAAQwU,EAAKzR,OAAO/C,MACpBuyC,EAAOisB,KACPY,EAAU5qD,EAAK6qD,oBAAoBr/D,GACpCo/D,GAAY5qD,EAAK49C,YAIjB+E,IACHA,EAAW3iD,EAAK2iD,UAElB3iD,EAAKqqD,OACD7+D,EAAM8Y,YAAc9Y,EAAM+Y,cACvBumD,EAAAA,QAAUt/D,EAAM+Y,YAAc,EAAI9c,SAAS+D,EAAM8Y,WAAa9Y,EAAM+Y,YAAc,IAAK,IAAM,GAC9FvE,EAAK/mB,OAAOo3B,OAAS05C,IAGdhsB,EAAO/9B,EAAK+qD,SAAWpI,KAFhCn3D,GAASA,EAAM8Y,YAActE,EAAKysB,OAAOm+B,EAAS5qD,EAAK8qD,SACvD9qD,EAAK+qD,QAAUhtB,IAMnB/9B,EAAK5U,QAA6B,UAAnB4U,EAAKgrD,UAAwBt7D,EAAKrS,WAAU+8B,EAAApa,GAAOA,EAAK/kB,MAAO0nE,GAAYjzD,EAAK/S,sBAAsBqjB,EAAK/kB,WAC3H4mB,EAAAuY,EAAApa,WAEM,WACDA,EAAK5U,UACY,UAAnB4U,EAAKgrD,UAAwBt7D,EAAKnR,aAAY67B,EAAApa,GAAOA,EAAK5U,SAAWsE,EAAKtS,qBAAqB4iB,EAAK5U,SAEpG4U,EAAK5U,QAAU,SAElB4U,EA5QAkqD,OA4QArvE,EAAAqvE,EAAA,CAAA,CAAApvE,IAAA,cAAAC,MA1QD,WAAe,IAAAumB,EAAA1nB,MACuB,IAAhCA,KAAK4vB,aAAayhD,YACpBrxE,KAAKX,OAAOm2B,SAAU,GAEnB86C,EAAUltD,YACbpjB,KAAKX,OAAOm2B,SAAU,GAExBoL,IAAAA,EAAqC5gC,KAAKX,OAAlCm2B,EAAOoL,EAAPpL,QAASiB,EAAImK,EAAJnK,KAAM66C,EAAS1wC,EAAT0wC,UACnB97C,IAMJx1B,KAAKuvC,KAAO,CACV7iC,MAAO,EACPC,OAAQ,EACR4kE,OAAQ,EACRC,QAAS,EACT1gE,EAAG,EACHC,EAAG,EACH+zB,GAAI,GAKN9kC,KAAK2/C,SAAU,EAEf3/C,KAAK8wE,WAAY,EAIjB9wE,KAAKkxE,QAAU,EAIflxE,KAAKmxE,QAAU,EAIfnxE,KAAK+oE,SAAWl7D,SAAS,IAAOyjE,EAAW,IAK3CtxE,KAAK+jE,OAAS,KAId/jE,KAAKgkE,UAAY,KAEjBhkE,KAAKuwE,YAAc,EAEda,KAAAA,UAAYpxE,KAAKX,OAAOo3B,OAAS05C,IAAmBnwE,KAAK+oE,UAAY,IAAO,QAAU,YAEtFpvD,KAAAA,KAAKF,IAAiB,WACpBiO,EAAK/S,SAGV+S,EAAK7G,OACL6G,EAAK+pD,iBACA/pD,EAAK/S,OAAO0Q,QACfqC,EAAKrmB,YAILo1B,IAAS05C,KAIT15C,IAAS05C,KACN50D,KAAAA,GAAG9B,GAAgB,WACtBiO,EAAK+oD,UAEFl1D,KAAAA,GAAG9B,GAAa,WACXs3D,IAAAA,EAAkBrpD,EAAKroB,OAAvB0xE,cACRrpD,EAAKkpD,oBAAsBlpD,EAAKrmB,MAAM,EAAG0vE,MAEtCx1D,KAAAA,GAAG9B,GAAc,WACpBiO,EAAK+oD,WAIJl1D,KAAAA,GAAG9B,EAAoBzZ,KAAK0xE,cAC5Bn2D,KAAAA,GAAG9B,GAAmB,WACzBiO,EAAKopD,WAAY,EACjBppD,EAAK+oD,UAEEvoD,SAAAA,iBAAiB,mBAAoBloB,KAAK2xE,wBACpD,CAAAzwE,IAAA,YAAAC,MAED,SAAW9B,GAAQ,IAAAsoB,EAAA3nB,KACjB0F,OAAOC,KAAKtG,GAAQuG,SAAQ,SAAA1E,GACd,SAARA,GAAkB7B,EAAO6B,KAASymB,EAAKtoB,OAAO6B,GAC3C+5B,EAAAA,SAAS57B,EAAO6B,IACJ,cAARA,EACTymB,EAAKohD,SAAWl7D,SAAS,IAAOxO,EAAO6B,GAAM,IAC5B,YAARA,GAAqB7B,EAAO6B,IACrCymB,EAAK8oD,OAEFpxE,EAAAA,OAAO6B,GAAO7B,EAAO6B,QAE7B,CAAAA,IAAA,OAAAC,MAuBD,SAAM+lC,GACJ,IAAQvyB,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OACXuyE,KAAAA,aAAetB,EAAUuB,sBAC1B,IAEEx9C,IAAAA,EAAS6S,GAAS7nC,EAAO2T,KACxBqhB,IACHA,EAAUh1B,EAAOyyE,eAA+Bn9D,EAAO2wB,gBAAtB3wB,EAAO3B,MAE1CqhB,EAAOuC,mBAAmB,aAAY,gDAAAx2B,OACYf,EAAO+B,MAAK,yDAEzD4R,KAAAA,KAAOqhB,EAAOluB,SAAS,GACvB49D,KAAAA,OAAS/jE,KAAKy1B,KAAK,UAEnBz1B,KAAK4xE,eACH7N,KAAAA,OAAO/2D,MAAMgV,OAAS3iB,EAAO2iB,OAC7B+hD,KAAAA,OAAO/2D,MAAM+kE,aAAe1yE,EAAO2iB,QAErCgwD,KAAAA,KAAOhyE,KAAKy1B,KAAK,UAEtBp2B,EAAO4yE,UAAYjyE,KAAKgyE,KAAKhlE,MAAMklE,WAAa7yE,EAAO8yE,QACvDnyE,KAAKgkE,UAAYhkE,KAAK+jE,OAAOE,WAAW,YACjCt9D,GACElG,EAAAA,SAAS,mBAAoBkG,MAEzC,CAAAzF,IAAA,WAAAC,MAED,SAAU6R,GAER,GADoBhT,KAAKX,OAAjBm2B,SACSx1B,KAAKgT,KAAtB,CAGAhT,KAAKywE,OACL,IAAM2B,EAAKpyE,KAAKgT,KAAOhT,KAAKgT,KAAKqqD,cAAgB,KAIjD,GAHI+U,IAAOp/D,GACN6V,EAAAA,YAAY7oB,KAAKgT,MAEjBA,EAAL,CAIAhT,KAAK6gB,KAAK7N,GACVhT,KAAK6wE,aACGE,IAAAA,EAAkB/wE,KAAKX,OAAvB0xE,cACR/wE,KAAK4wE,oBAAsB5wE,KAAKqB,MAAM,EAAG0vE,QANvC/wE,KAAKgT,KAAO,QAShB,CAAA9R,IAAA,sBAAAC,MAKA,SAAqByQ,GACnB,IAAKA,EACI,OAAA,KAET,IAAMygE,EAAUzgE,GAASA,aAAiBjT,OAAO2zE,iBAAmB1gE,EAASA,EAAMmyD,OAASnyD,EAAMmyD,OAAUnyD,EAAM2gE,SAAW3gE,EAAM2gE,SAAW,KAC1IF,GAAAA,IAAiC,WAApBlrD,GAAQ7F,UAAwBxL,EAAKnE,MAAM0gE,IACnDA,OAAAA,EAGT,IAAMG,EAAWH,EAAUA,EAAQ9mE,QAAQmW,cAAgB,GACvD8wD,MAAa,WAAbA,GAAsC,QAAbA,EACpBH,EAGF,OACR,CAAAnxE,IAAA,iBAAAC,MAED,WACUm8B,IAAAA,EAAWt9B,KAAK4vB,aAAhB0N,OACR,GAAIA,EAAQ,CACV,IAAMryB,EAA8B,WAAxB6K,EAAKpO,OAAO41B,GAAuBA,EAAyC,WAA/BxnB,EAAKpO,OAAO41B,EAAOA,QAAuBA,EAAOA,OAAS,KACnHt9B,KAAKyyE,UAAUxnE,MAElB,CAAA/J,IAAA,mBAAAC,MAcD,WACUs1B,IAAAA,EAASz2B,KAAKX,OAAdo3B,KACD,OAAAz2B,KAAK8wE,YAAc9wE,KAAK2U,OAAO0Q,QAAUoR,IAAS05C,IAAqB15C,IAAS05C,KAGzF,CAAAjvE,IAAA,aAAAC,MAIA,WACQyQ,IAAAA,EAAQ5R,KAAK2U,OAAO/C,MAC1B,GAAKA,EAAM8Y,YAAe9Y,EAAM+Y,YAAhC,CAGA3qB,KAAKkxE,QAAUrjE,SAAS+D,EAAM8Y,WAAa9Y,EAAM+Y,YAAc,IAAK,IAC9DqmD,IAAAA,EAAUhxE,KAAKixE,oBAAoBr/D,GAEzCo/D,GAAWhxE,KAAK6yC,OAAOm+B,EAAShxE,KAAKkxE,YACtC,CAAAhwE,IAAA,YAAAC,MAmCD,SAAW8J,GAAK,IAAA2c,EAAA5nB,KAEd,GAAKiL,EAAL,CAIAynE,IAAAA,EAA0B1yE,KAAK+jE,OAAOx8B,wBAA9B76B,EAAKgmE,EAALhmE,MAAOC,EAAM+lE,EAAN/lE,OACXgmE,EAAQ,IAAIh0E,OAAO8Q,MACvBkjE,EAAMrjE,OAAS,WACb,GAAKsY,EAAKm8C,SAAUn8C,EAAKpW,UAAWoW,EAAK+3B,QAAzC,CAGA/3B,EAAKm8C,OAAOp3D,OAASA,EACrBib,EAAKm8C,OAAOr3D,MAAQA,EACpB,IAAMo4B,EAAKj3B,SAASnB,EAAQC,EAAS,IAAK,IAErCkmC,EAAAA,OAAO8/B,EAAO7tC,GACX6tC,EAAA,OAEVA,EAAMhoE,IAAMM,KACb,CAAA/J,IAAA,SAAAC,MAED,SAAQyQ,EAAOghE,GACb,GAAK5yE,KAAK+jE,QAAW/jE,KAAKgkE,WAAc4O,EAGpC,IACF,IAAQrjC,EAAiBvvC,KAAjBuvC,KAAMlwC,EAAWW,KAAXX,OACdwzE,EAA0B7yE,KAAK+jE,OAAOx8B,wBAA9B76B,EAAKmmE,EAALnmE,MAAOC,EAAMkmE,EAANlmE,OACXD,GAAAA,IAAU6iC,EAAK7iC,OAASC,IAAW4iC,EAAK5iC,QAAU4iC,EAAKzK,KAAO8tC,EAAU,CAC1E,IAAM9tC,EAAKj3B,SAASnB,EAAQC,EAAS,IAAK,IAC1C4iC,EAAKzK,GAAK8tC,EACVrjC,EAAK7iC,QAAUA,IAAU6iC,EAAK7iC,MAAQ1M,KAAK+jE,OAAOr3D,MAAQA,GAC1D6iC,EAAK5iC,SAAWA,IAAW4iC,EAAK5iC,OAAS3M,KAAK+jE,OAAOp3D,OAASA,GAC9D,IAAI6kE,EAAU7kE,EACV4kE,EAAS7kE,EACTo4B,EAAK8tC,EACPrB,EAAS1jE,SAASlB,EAASimE,EAAW,IAAK,IAClC9tC,EAAK8tC,IACdpB,EAAU3jE,SAAiB,IAARnB,EAAckmE,EAAU,KAExCrB,EAAAA,OAASA,EAASlyE,EAAOyzE,SACzBtB,EAAAA,QAAUA,EAAUnyE,EAAOyzE,SAC3BhiE,EAAAA,GAAKpE,EAAQ6iC,EAAKgiC,QAAU,EAC5BxgE,EAAAA,GAAKpE,EAAS4iC,EAAKiiC,SAAW,EAGrCxxE,KAAK4xE,eAAiB5xE,KAAKgkE,UAAUhiD,OAAS3iB,EAAO2iB,QAChDgiD,KAAAA,UAAUkB,UAAUtzD,EAAO29B,EAAKz+B,EAAGy+B,EAAKx+B,EAAGw+B,EAAKgiC,OAAQhiC,EAAKiiC,eAC3D7qE,GACElG,EAAAA,SAAS,mBAAoBkG,MAEzC,CAAAzF,IAAA,UAAAC,MAED,WACEnB,KAAKywE,OACIroD,SAAAA,oBAAoB,mBAAoBpoB,KAAK2xE,oBACtD3xE,KAAKgkE,UAAY,KACjBhkE,KAAK+jE,OAAS,OACf,CAAA7iE,IAAA,SAAAC,MAED,WACS,MAAA,MACR,CAAA,CAAAD,IAAA,aAAAK,IAzXD,WACS,MAAA,cAGT,CAAAL,IAAA,gBAAAK,IAGA,WACS,MAAA,CACLuwE,eAAe,EACft8C,SAAS,EACTp0B,OAAO,EAQPq1B,KAAM,YACN66C,UAAW,GACXtvD,OAAQ,aACRwuD,gBAAiB,EACjBO,cAAe,EACfkB,SAAS,EACTa,SAAU,IACVX,OAAQ,qBAIZ,CAAAjxE,IAAA,YAAAK,IAIA,WACM,MAA2B,kBAApB8uE,GACFA,GAETA,GAjEJ,WACM,IAEF,QADY/qE,SAASC,cAAc,UAAU0+D,iBAKtCt9D,GACA,OAAA,GAyDWosE,KAEnB,CAAA7xE,IAAA,sBAAAC,MAED,WACE,QAA6B,WAApBgmB,GAAQ7F,SAA4C,YAApB6F,GAAQ7F,aAClDgvD,GA7CqBt8C,IChDlBg/C,GAAO,OAEL/5D,GAAiBQ,GACJw5D,YAAKh/C,GAAAhY,EAAAg3D,EAAAh/C,GAAA/X,IAAAA,EAAAC,EAAA82D,GAAA,SAAAA,IAAA7sD,IAAAA,EAAAplB,OAAAiyE,GAAA,IAAA,IAAAvzE,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAyDrBqmB,OAzDqB6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,KAUD,sBAAA,SAAC+vE,GACdhwE,IAAAA,EAAOkjB,EAAK+sD,WACZC,EAAU1tE,OAAO6gB,OAAO,GAAI2sD,EAAY,CAAEl9D,IAAKk9D,EAAWl9D,KAAOk9D,EAAW9iD,SAClFhK,EAAKitD,OAAOL,KAAMrrE,KAAI4oB,EAAAA,EAAA,CACpBzuB,KAAM,cACHoB,GAAI,GAAA,CACPkwE,QAAAA,QAEHnrD,EAAAuY,EAAApa,eAqBU,WACTA,EAAKw1B,WACN3zB,EAAAuY,EAAApa,GAEa,eAAA,SAACwE,GACbxE,EAAKpnB,KAAK4rB,MACX3C,EAAAuY,EAAApa,qBAEgB,WACTktD,IAAAA,EAAQltD,EAAKmtD,WACbpR,EAAO,IAAI/C,KAAK,CAACoU,KAAKC,UAAUH,IAAS,CAAExxE,KAAM,qBACjD4xE,EAAc/0E,OAAO0gE,IAAIC,gBAAgB6C,GACzC1F,EAAOn3D,SAASC,cAAc,KACpCk3D,EAAKzvD,MAAMsB,QAAU,OACrBmuD,EAAK59D,KAAO60E,EACZjX,EAAKt9B,SAAW,aAChBs9B,EAAKkX,UAAW,EAChBlX,EAAKtJ,WACN/sC,EAjDF6sD,OAiDEhyE,EAAAgyE,EAAA,CAAA,CAAA/xE,IAAA,WAAAC,MArCD,WACS,MAAA,CACLyyE,UAAW9vE,KAAKC,MAChB8vE,YAAY,IAAI/vE,MAAOgwE,iBAE1B,CAAA5yE,IAAA,cAAAC,MAED,WACEnB,KAAK47C,QACArgC,KAAAA,GAAG9B,GAAoBzZ,KAAK+zE,oBACjC/zE,KAAKub,GAAGtC,GAAaC,WAAYlZ,KAAKg0E,aACtCh0E,KAAKub,GAAGtC,GAAaE,eAAgBnZ,KAAKi0E,gBAC1Cj0E,KAAKub,GAAGtC,GAAaG,YAAapZ,KAAKmjD,YACxC,CAAAjiD,IAAA,UAAAC,MAED,WACEnB,KAAK2wB,WACN,CAAAzvB,IAAA,gBAAAC,MAsBD,WACEnB,KAAKi0E,mBAGP,CAAA/yE,IAAA,OAAAC,MAGA,SAAMypB,GACAA,EAAKspD,QACPl0E,KAAKm0E,aAAavpD,GAElB5qB,KAAKo0E,MAAMxpD,KAEd,CAAA1pB,IAAA,QAAAC,MAED,SAAOypB,GACC1nB,IAAAA,EAAOlD,KAAKmzE,WACbE,KAAAA,OAAa1rE,KAAAA,KAAI4oB,EAAAA,EAAA,GACjBrtB,GAAI,GAAA,CACPkwE,QAASxoD,OAEZ,CAAA1pB,IAAA,eAAAC,MAED,SAAcypB,GACRA,GAAAA,GAAQA,EAAKypD,QAAS,CAClBC,IAEAJ,EAAO3jD,EAAA,CACXgkD,IAAK,WACLC,IAJY1wE,KAAKC,MACC6mB,EAAKypD,QAIvB3oE,KAAMkf,EAAKlf,MAAQkf,EAAK5U,IACxBy+D,GAAI,IACJ1xC,IAAK,EACL2xC,IAAK,EACLC,GAAI/pD,EAAKypD,QACTH,SAAS,GACNtpD,GAEL5qB,KAAKo0E,MAAMF,QAEXj0E,QAAQf,KAAK,mDAEhB,CAAAgC,IAAA,QAAAC,MAED,WAASyzE,IAAAA,EACP50E,KAAKqzE,QAAMprD,EAAA2sD,KACR5B,GAAO,IAAE/qD,EAAA2sD,UACH,IAAEA,KAEZ,CAAA1zE,IAAA,WAAAC,MAED,WAIE,IAHA,IACM0zE,EADa70E,KAAX2U,OACiB9C,MACnBxB,EAAW,GACR1O,EAAI,EAAGA,EAAIkzE,EAAUxkE,SAASzQ,OAAQ+B,IAC7C0O,EAAS1I,KAAK,CACZtG,MAAOwzE,EAAUxkE,SAAShP,MAAMM,GAChCL,IAAKuzE,EAAUxkE,SAAS/O,IAAIK,KAGhC,IAAMmzE,EAAY,CAChB5gE,YAAa2gE,EAAU3gE,YACvBqB,WAAYs/D,EAAUt/D,WACtBlF,SAAAA,EACAgV,OAAQwvD,EAAUxvD,OAClBhQ,MAAOw/D,EAAUx/D,OAIZ,OADPrV,KAAKqzE,OAAOxhE,MAAQijE,EACb,CACLC,IAAK/0E,KAAKqzE,OACV2B,SAAUh1E,KAAKi1E,gBACff,QAASl0E,KAAKk1E,iBAEjB,CAAAh0E,IAAA,gBAAAC,MAED,WAiBSg0E,OAhBSn1E,KAAKqzE,OAAOL,KACPprE,KAAI,SAAAwtE,GACjBxqD,IAAAA,EAAOwqD,EAAKhC,QAAQxoD,KACtB5U,EAAM,GACN,IACE4U,aAAgBkK,MAClB9e,EAAM4U,EAAK5U,SACO3S,IAATunB,IACH4oD,EAAAA,KAAKC,UAAU7oD,UAEhB3rB,GACCiB,QAAAA,IAAI,MAAOjB,GAGrB,MAAA,IAAAmB,OAAWg1E,EAAKvB,mBAAUzzE,OAAOg1E,EAAKhC,QAAQp9D,IAAG5V,KAAAA,OAAI4V,EAAG,UAG3D,CAAA9U,IAAA,cAAAC,MAED,WACE,IAAM+yE,EAAU,CACdmB,YAAa,IAQRnB,OANSl0E,KAAKqzE,OAAOL,KACpBptE,SAAQ,SAAAwvE,GACVA,EAAKhC,QAAQc,SACPmB,EAAAA,YAAY1tE,KAAKytE,EAAKhC,YAG3Bc,KACR,CAAA,CAAAhzE,IAAA,aAAAK,IAtKH,WACS,MAAA,UACR,CAAAL,IAAA,gBAAAK,IAED,WACE,MAAO,OAER0xE,GARgC1jD,ICFd+lD,YAAOrhD,GAAAhY,EAAAq5D,EAAArhD,GAAA/X,IAAAA,EAAAC,EAAAm5D,GAAA,SAAAA,IAAAlvD,IAAAA,EAAAplB,OAAAs0E,GAAA,IAAA,IAAA51E,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAsFzBqmB,OAtFyB6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,kBAgCd,WACVs9B,IAAAA,EAAAD,EAAApa,GAAQzR,EAAM8rB,EAAN9rB,OAAQtV,EAAMohC,EAANphC,OAChB,GAAIsV,EAAO9C,MAAM0D,aAAezD,iBAAiBsM,aAAjD,CAGIzJ,GAAAA,EAAO9C,MAAMwY,SACX,IAACjE,EAAKmvD,qBAAwB,YAElCnvD,EAAKmvD,sBAAuB,EAG1B5gE,IAAAA,EAAO9C,MAAMwT,QAAuC,IAA7B1Q,EAAO9C,MAAMqC,cAAqBkS,EAAKovD,UAA9D7gE,CAIEtE,IAAAA,EAAWsE,EAAO9C,MAAMxB,SACxBolE,EAAgBp2E,EAAOo2E,eAAiB,GACxCC,EAAwBr2E,EAAOq2E,uBAAyB,GACxDxhE,EAAcS,EAAO9C,MAAMqC,YAC3ByqD,EAAMv4C,EAAKuvD,UAAUtlE,EAAU6D,EAAawhE,GAC9C/W,GAAQ,OAARA,GAAwB,IAARA,EAAhBA,CAGIz+D,QAAAA,IAAI,wBAAyBmQ,EAAShP,MAAMs9D,GAAMtuD,EAAS/O,IAAIq9D,IACvE,IAAMiX,EAASvlE,EAAShP,MAAMs9D,GAAO,GAGrC,KAAIiX,EAFYjhE,EAAO9C,MAAMgB,UAE7B,CAGA,IAAMgjE,EAAWD,EAAS1hE,EACpB4hE,EAAaD,GAAYJ,EAC3BI,EAAWP,EAAQS,uBAInBD,KACwB,IAAtBz2E,EAAO22E,aACTrhE,EAAO9C,MAAMqC,YAAckS,EAAK6vD,SAAWL,EAAS,GAAMA,GAE5DxvD,EAAKzR,QAAUyR,EAAKzR,OAAOoG,KAAK,aAChC9a,QAAQC,IAAI,mBAAoBy+D,EAAK,eAAgBmX,EAAY,gBAAiBnhE,EAAO9C,MAAMqC,YAAa,aAAeA,EAAcS,EAAO9C,MAAMqC,aAEvI,MAAX0hE,GACQjhE,GAAAA,EAAOoG,KAAK,MAAO,CAC3BjZ,KAAM,WACNo0E,SAAU,MACVtvC,IAAKjyB,EAAOtV,OAAOunC,IACnB3xB,IAAK,CACHkhE,cAAehyE,KAAKkF,MAAe,IAATusE,cAKnCxvD,EA3EAkvD,OA2EAr0E,EAAAq0E,EAAA,CAAA,CAAAp0E,IAAA,cAAAC,MAzED,WAAe,IAAAumB,EAAA1nB,MAEM,IADIA,KAAKX,OAApB22E,aAIRh2E,KAAKw1E,WAAY,EACjBx1E,KAAKu1E,sBAAuB,EAC5Bv1E,KAAKi2E,SAAW,4BAA4BvoE,KAAK6T,UAAUE,aAAe,SAAS/T,KAAK6T,UAAUE,aAAe,aAAa/T,KAAK6T,UAAUkB,UACxIlH,KAAAA,GAAG9B,EAAgBzZ,KAAKo2E,WAExB76D,KAAAA,GAAG9B,GAAa,WACnBiO,EAAK8tD,WAAY,KAGdj6D,KAAAA,GAAG9B,GAAgB,WACtBiO,EAAK6tD,sBAAuB,QAE/B,CAAAr0E,IAAA,YAAAC,MA0DD,SAAWkP,EAAUnN,EAAMmzE,GACzB,IAAKhmE,IAAaA,EAASzQ,OAClB,OAAA,KAELyQ,GAAoB,IAApBA,EAASzQ,QAAgByQ,EAAS/O,IAAI,GAAK+O,EAAShP,MAAM,GAAK,KAC1D,OAAA,KAIT,IAFMi1E,IAAAA,EAAet2E,KAAKu2E,aAAalmE,GACnCsuD,EAAM,KACDh9D,EAAI,EAAGA,EAAI20E,EAAa12E,OAAQ+B,IAAK,CAExCkE,GADSywE,EAAa30E,GACjBN,MAAQ6B,IAAe,IAANvB,GAAW20E,EAAa30E,EAAI,GAAGL,IAAM4B,GAAQmzE,GAAY,CAC3E10E,EAAAA,EACN,OAGGg9D,OAAAA,IACR,CAAAz9D,IAAA,eAAAC,MAED,SAAcoP,GACZ,IAAKA,EACH,MAAO,GAGT,IADA,IAAMrB,EAAM,GACHvN,EAAI,EAAGA,EAAI4O,EAAE3Q,OAAQ+B,IAC5BuN,EAAIvH,KAAK,CACPtG,MAAOkP,EAAElP,MAAMM,GACfL,IAAKiP,EAAEjP,IAAIK,KAGRuN,OAAAA,KACR,CAAA,CAAAhO,IAAA,aAAAK,IAtHD,WACS,MAAA,YACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLy0E,YAAY,EACZP,cAAe,GACfC,sBAAuB,QAE1BJ,GAXkC/lD,IAyHrC+lD,GAAQS,sBAAwB,KCzHXS,IAAAA,YAAkBviD,GAAAhY,EAAAu6D,EAAAviD,GAAA/X,IAAAA,EAAAC,EAAAq6D,GAAA,SAAAA,IAAApwD,IAAAA,EAAAplB,OAAAw1E,GAAA,IAAA,IAAA92E,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GAoEpCqmB,OApEoC6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,kBAqCzB,WACV,IAAQ9D,EAARmhC,EAAApa,GAAQ/mB,OACJ+mB,EAAKqwD,QAAUp3E,EAAOq3E,YAActwD,EAAKgrC,QAA0C,IAAjC/xD,EAAOs3E,wBAG7DvwD,EAAKgrC,MAAQ3tD,WAAW2iB,EAAKwwD,OAA6B,IAArBv3E,EAAOw3E,iBAC7C5uD,EAAAuY,EAAApa,aAEQ,WACP8nC,IAAAA,EAAA1tB,EAAApa,GAAQzR,EAAMu5C,EAANv5C,OAAQtV,EAAM6uD,EAAN7uD,OAGhB,GAFAsF,aAAayhB,EAAKgrC,OAClBhrC,EAAKgrC,MAAQ,OACThrC,EAAKqwD,QAAUp3E,EAAOq3E,aAA+C,IAAjCr3E,EAAOs3E,uBAI3ChiE,EAAO9C,MAAMwT,QAAuC,IAA7B1Q,EAAO9C,MAAMqC,aAAqBkS,EAAKovD,WAA9D7gE,CAGJyR,EAAKyvD,SAAWx2E,EAAOw2E,UAAYzvD,EAAKqwD,QAAU,GAC9CrwD,EAAKqwD,UAAYp3E,EAAOw2E,UAAYzvD,EAAKyvD,SAAW,IACtDzvD,EAAKyvD,SAAW,GAEZD,IAAAA,EAASjhE,EAAOT,YAAckS,EAAKyvD,SAGrCD,EAFYjhE,EAAO9C,MAAMgB,WAKxB4jE,EAAAA,UACL9hE,EAAOT,YAAc0hE,OACtBxvD,EAxDAowD,OAwDAv1E,EAAAu1E,EAAA,CAAA,CAAAt1E,IAAA,cAAAC,MAtDD,WAAe,IAAAumB,EAAA1nB,KACb4gC,EAA4C5gC,KAAKX,OAAzCs3E,EAAqB/1C,EAArB+1C,sBAAuBd,EAAQj1C,EAARi1C,UACD,IAA1Bc,IAGJ32E,KAAKw1E,WAAY,EACjBx1E,KAAKy2E,QAAU,EAIfz2E,KAAKoxD,MAAQ,KACbpxD,KAAK61E,SAAWA,EACXt6D,KAAAA,GAAG9B,EAAgBzZ,KAAKsqB,WAC7BtqB,KAAKub,GAAG,CAAC9B,EAAgBA,IAAiB,WACxC9U,aAAa+iB,EAAK0pC,OAClB1pC,EAAK0pC,MAAQ,KACRykB,EAAAA,SAAWnuD,EAAKroB,OAAOw2E,YAEzBt6D,KAAAA,GAAG9B,GAAa,WACnBiO,EAAK8tD,WAAY,SAEpB,CAAA,CAAAt0E,IAAA,aAAAK,IAlCD,WACS,MAAA,uBACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLo1E,uBAAuB,EACvBE,YAAa,GACbhB,SAAU,EACVa,WAAY,OAEfF,GAZ6CjnD,ICD1CunD,GAAqB,MACrBC,GAAa,CAAC,OACCC,YAAS/iD,GAAAhY,EAAA+6D,EAAA/iD,GAAA/X,IAAAA,EAAAC,EAAA66D,GAAA,SAAAA,IAAA5wD,IAAAA,EAAAplB,OAAAg2E,GAAA,IAAA,IAAAt3E,EAAAC,UAAAC,OAAAuD,EAAArD,IAAAA,MAAAJ,GAAAK,EAAA,EAAAA,EAAAL,EAAAK,IAAAoD,EAAApD,GAAAJ,UAAAI,GA4I3BqmB,OA5I2B6B,EAAAuY,EAAAtkB,EAAAA,EAAAzV,KAAAtG,MAAA+b,EAAA,CAAAlc,MAAAI,OAAA+C,iBAiBjB,WAACrB,IAAAA,EAAInC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAGm3E,GACjB,IAAK1wD,EAAK6wD,iBAAmB7wD,EAAK6wD,eAAen1E,GAAc,OAAA,EAC3DskB,GAAAA,EAAK6wD,eAAen1E,GAAMlC,QAAU,EAAU,OAAA,EAClD,IAAImyC,EAAQ,EAIZ,OAHA3rB,EAAK6wD,eAAen1E,GAAM8F,KAAI,SAAA/B,GACnBA,GAAAA,KAEJ1B,KAAKkF,MAAM0oC,EAAQ3rB,EAAK6wD,eAAen1E,GAAMlC,WACrDqoB,EAAAuY,EAAApa,iBAoBY,WACPtQ,EAAKnE,MAAMyU,EAAKzR,OAAO/C,SAG3BwU,EAAK8wD,gBACL9wD,EAAK+wD,IAAM,EACX/wD,EAAKgrC,MAAQ3tD,WAAW2iB,EAAKgxD,UAAWhxD,EAAK/mB,OAAOg4E,kBACrDpvD,EAAAuY,EAAApa,oBAEe,WACdA,EAAK6wD,eAAiB,GACXrxE,GAAAA,SAAQ,SAAC9D,GACbm1E,EAAAA,eAAen1E,GAAQ,SAE/BmmB,EAAAuY,EAAApa,GAEoB,sBAAA,SAACwE,GACpBA,EAAK0sD,OAASlxD,EAAKmxD,WAAW3sD,EAAK0sD,MAAO1sD,EAAK9oB,MAAQg1E,OACxD7uD,EAAAuY,EAAApa,gBAEW,WAGV,GAFAzhB,aAAayhB,EAAKgrC,OAClBhrC,EAAKgrC,MAAQ,KACRhrC,EAAKzR,QAAWyR,EAAK/mB,OAAOm4E,UAAjC,CACA,IAAA52C,EAAiDxa,EAAK/mB,OAA9C4L,EAAG21B,EAAH31B,IAAKwsE,EAAQ72C,EAAR62C,SAAUC,EAAO92C,EAAP82C,QAASL,EAAYz2C,EAAZy2C,aAC1BM,EAAe1sE,GAAOA,EAAInM,QAAQ,KAAO,EAAI,WAAa,YAAcgF,KAAKC,MAC/EqiB,KAAAA,EAAK+wD,KAAOO,GAAZtxD,CAGC+wD,EAAAA,MACD,IACF,IAAM91E,GAAQ,IAAIyC,MAAOsO,UACrB9Q,EAAM,KACJ6/D,EAAM,IAAIC,eAChBh7C,EAAK+6C,IAAMA,EACPl1C,EAAAA,KAAK,MAAO0rD,GAChB,IAAMpW,EAAU,GACV/uD,EAASrO,KAAKkF,MAAsB,GAAhBlF,KAAKqO,UAC/B+uD,EAAQqW,MAAQ,SAAWplE,EAAS,KAAOilE,EAAWjlE,GAClD+uD,GACF77D,OAAOC,KAAK47D,GAAS37D,SAAQ,SAAA0jB,GACvBm4C,EAAAA,iBAAiBn4C,EAAGi4C,EAAQj4C,OAGpC63C,EAAI0W,mBAAqB,WACnB1W,GAAmB,IAAnBA,EAAI5rD,WAAkB,CACxB6Q,EAAK+6C,IAAM,KACL7/D,GAAA,IAAIwC,MAAOsO,UACjB,IAAMs1C,EAAOyZ,EAAI2W,kBAAkB,kBAAoB,KAAO,EACxDR,EAAQnzE,KAAKgF,MAAa,IAAPu+C,GAAepmD,EAAMD,IAC9C+kB,EAAKmxD,WAAWD,GAChBlxD,EAAKgrC,MAAQ3tD,WAAW2iB,EAAKgxD,UAAWC,KAG5ClW,EAAIc,aACGt7D,GACP1G,QAAQhB,MAAM0H,SAEjBshB,EAAAuY,EAAApa,GAEY,cAAA,SAACkxD,GAAOx1E,IAAAA,EAAInC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAGm3E,GAC1B,GAAK1wD,EAAK6wD,gBAAmB7wD,EAAK6wD,eAAen1E,GAAjD,CACQi2E,IAAAA,EAAiB3xD,EAAK/mB,OAAtB04E,aACJ3xD,EAAK6wD,eAAen1E,GAAMlC,QAAUm4E,GACjCd,EAAAA,eAAen1E,GAAMk2E,QAEvBf,EAAAA,eAAen1E,GAAM6F,KAAK2vE,GAC/B,IAAA72C,EAAAD,EAAApa,GAAQzR,EAAM8rB,EAAN9rB,OACJA,IACOmiE,IAAAA,GAAsBniE,EAAOsjE,cAAgBX,EAAU3iE,EAAOyR,EAAK8xD,aAAa,WAAYp2E,IAASw1E,GAEhHlxD,EAAK+xD,YAAYr2E,OAClBmmB,EAAAuY,EAAApa,kBAMa,WAACtkB,IAAAA,EAAInC,UAAAC,OAAA,QAAAyD,IAAA1D,UAAA,GAAAA,UAAA,GAAGm3E,GACdQ,EAAQlxD,EAAKgyD,SAASt2E,GAC5BosD,EAAA1tB,EAAApa,GAAQzR,EAAMu5C,EAANv5C,OACR,GAAIA,EACF,GAAI7S,IAASg1E,GACLniE,EAAO0jE,UAAYf,IAAU3iE,EAAO0jE,WACxC1jE,EAAO0jE,SAAWf,EAClB3iE,EAAOoG,KAAKtB,GAA8B,CAAC69D,MAAAA,EAAcW,cAAetjE,EAAOsjE,qBAE5E,CACL,IAAMK,EAAYlyD,EAAK8xD,aAAa,MAAOp2E,GACtC6S,EAAO2jE,IAAchB,IAAU3iE,EAAO2jE,KACzC3jE,EAAO2jE,GAAahB,EACpB3iE,EAAOoG,KAAKtB,GAA8B,CAAC69D,MAAAA,EAAcW,cAAetjE,EAAOsjE,qBAItF7xD,EA7HA4wD,OA6HA/1E,EAAA+1E,EAAA,CAAA,CAAA91E,IAAA,cAAAC,MAjHD,WACE,IAAAogC,EAAwCvhC,KAAKX,OAArCm4E,EAASj2C,EAATi2C,UAAWe,EAAgBh3C,EAAhBg3C,kBACfA,MAAAA,OAAgB,EAAhBA,EAAkB34E,QAAS,GAC7Bm3E,GAAWpvE,KAAIxH,MAAf42E,GAAUhsE,EAASwtE,IAErBv4E,KAAKk3E,gBACA37D,KAAAA,GAAG,kBAAmBvb,KAAKw4E,oBAIhCx4E,KAAKoxD,MAAQ,KACbpxD,KAAKm3E,IAAM,EACXn3E,KAAKmhE,IAAM,KACNqW,GAGLx3E,KAAKub,GAAG,CAAC9B,EAAoBA,IAAgBzZ,KAAKsD,cACnD,CAAApC,IAAA,eAAAC,MA2ED,SAAcs3E,EAAY32E,GACjB22E,OAAAA,EAAa,QAAU32E,EAAKkmB,gBACpC,CAAA9mB,IAAA,YAAAK,IAkCD,WACE,OAAOvB,KAAKX,OAAOm4E,WACpB/tD,IAfD,SAAetoB,GAET,GADJnB,KAAKX,OAAOm4E,UAAYr2E,GACnBA,GAASnB,KAAKoxD,MAGjB,OAFAzsD,aAAa3E,KAAKoxD,YAClBpxD,KAAKoxD,MAAQ,MAGX,GAAApxD,KAAKX,OAAOm4E,UAAW,CACzB,GAAIx3E,KAAKoxD,MAAO,OAChBpxD,KAAKoxD,MAAQ3tD,WAAWzD,KAAKo3E,UAAWp3E,KAAKX,OAAOg4E,iBAEvD,CAAAn2E,IAAA,UAAAC,MAMD,WAAW,IAAAumB,EAAA1nB,KACJyb,KAAAA,IAAI,kBAAmBzb,KAAKw4E,oBACjCx4E,KAAKyb,IAAI,CAAChC,EAAoBA,IAAgBzZ,KAAKsD,YACxCsC,GAAAA,SAAQ,SAAC9D,GAClB4lB,EAAKuvD,gBAAkBvvD,EAAKuvD,eAAen1E,KAAU4lB,EAAKuvD,eAAen1E,GAAQ,OAE9Em1E,KAAAA,iBAAmBj3E,KAAKi3E,eAAiB,IAC9CtyE,aAAa3E,KAAKoxD,OAClBpxD,KAAKoxD,MAAQ,KACTpxD,KAAKmhE,KAA+B,IAAxBnhE,KAAKmhE,IAAI5rD,aACvBvV,KAAKmhE,IAAI18D,QAAUzE,KAAKmhE,IAAI18D,SAC5BzE,KAAKmhE,IAAM,SAEd,CAAA,CAAAjgE,IAAA,aAAAK,IA3KD,WACS,MAAA,cACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLi2E,WAAW,EACXE,QAAS,EACTD,SAAU,OACVJ,aAAc,IACdpsE,IAAK,GACL8sE,aAAc,EACdQ,iBAAiB,QAEpBvB,GAfoCznD,ICOlBmpD,YAASzkD,GAAAhY,EAAAy8D,EAAAzkD,GAAA/X,IAAAA,EAAAC,EAAAu8D,GAAA,SAAAA,IAAAx8D,OAAAlb,OAAA03E,GAAAx8D,EAAA/b,MAAAH,KAAAL,WAY3B+4E,OAZ2Bz3E,EAAAy3E,EAAA,CAAA,CAAAx3E,IAAA,cAAAC,MAc5B,WAAe,IAAAilB,EAAApmB,KACL2U,EAAmB3U,KAAnB2U,OAAQtV,EAAWW,KAAXX,OACVwS,EAAQ8C,EAAO9C,OAAS8C,EAAO/C,OACrC5R,KAAKoxD,MAAQ,KACbpxD,KAAK24E,mBAAqB,EAC1B34E,KAAK44E,mBAAqB,EAC1B54E,KAAK64E,gBAAkB,KACvB74E,KAAK84E,SAAW,GACZz5E,EAAOs0E,WACqB9hE,EAAMugC,0BAEjC72B,KAAAA,GAAG9B,GAAa,WACnB2M,EAAK2yD,gBAGFx9D,KAAAA,GAAG9B,GAAc,WACpB2M,EAAK4yD,eAGFz9D,KAAAA,GAAG9B,GAAc,WACpB2M,EAAK4yD,eAGFz9D,KAAAA,GAAG9B,GAAgB,WACtB2M,EAAK4yD,kBAER,CAAA93E,IAAA,aAAAC,MAED,WAAc,IAAAumB,EAAA1nB,KACZA,KAAKg5E,YACAC,KAAAA,OAASx1E,YAAW,WACvBikB,EAAKwxD,kBACLxxD,EAAKqxD,eACJ/4E,KAAKX,OAAO85E,QAChB,CAAAj4E,IAAA,YAAAC,MAED,WACEwD,aAAa3E,KAAKi5E,QAClBj5E,KAAKi5E,OAAS,OACf,CAAA/3E,IAAA,eAAAC,MAED,SAAc4oC,EAAS15B,GAGrB,IAFA,IAAI+oE,GAAe,EACbC,EAAU,GACP13E,EAAI,EAAGA,EAAI0O,EAASzQ,OAAQ+B,IAAK,CAClCN,IAAAA,EAAQgP,EAAShP,MAAMM,GACvBL,EAAM+O,EAAS/O,IAAIK,GAEzB,GADA03E,EAAQ1xE,KAAK,CAAEtG,MAAAA,EAAOC,IAAAA,IAClBD,GAAS0oC,GAAWA,GAAWzoC,EAAM,EAAG,CAC3B83E,GAAA,EACf,OAGG,MAAA,CACLA,aAAAA,EACAC,QAAAA,KAEH,CAAAn4E,IAAA,cAAAC,MAED,SAAam4E,EAAkB/mC,EAAkBD,EAAoBinC,GACnE,IAAM1nE,EAAQ7R,KAAK2U,OAAO9C,OAAS7R,KAAK2U,OAAO/C,MACzC4nE,EAASl0E,SAASk0E,OAChBn0D,EAA8CxT,EAA9CwT,OAAQ9P,EAAsC1D,EAAtC0D,WAAYrB,EAA0BrC,EAA1BqC,YAAa7D,EAAawB,EAAbxB,SAErCmpE,KAAAA,GAAUn0D,GAAU9P,EAAa,GAAjCikE,CAGJC,IAAAA,EAAkCz5E,KAAK05E,aAAaxlE,EAAa7D,GAAzD+oE,EAAYK,EAAZL,aAAcC,EAAOI,EAAPJ,QACjBD,IAIDE,GAAoBt5E,KAAKX,OAAOs6E,aAC7Bf,KAAAA,qBACL54E,KAAK84E,SAASnxE,KAAK,CAAEuM,YAAAA,EAAamlE,QAAAA,EAASC,iBAAAA,EAAkB/mC,iBAAAA,EAAkBD,mBAAAA,EAAoBinC,cAAAA,IAE/Fv5E,KAAK44E,oBAAsB54E,KAAKX,OAAOu6E,aACpC7+D,KAAAA,KAAKtB,GAAkBzZ,KAAK84E,UACjC94E,KAAK65E,WAGP75E,KAAK65E,aAER,CAAA34E,IAAA,SAAAC,MAED,WACEnB,KAAK84E,SAAW,GAChB94E,KAAK44E,mBAAqB,IAC3B,CAAA13E,IAAA,kBAAAC,MAED,WACE,IAAM0Q,EAAQ7R,KAAK2U,OAAO9C,OAAS7R,KAAK2U,OAAO/C,MAC/C,GAAKC,EAAL,CAGAioE,IAAAA,EAAiDjoE,EAAMugC,0BAA/CG,EAAgBunC,EAAhBvnC,iBAAkBD,EAAkBwnC,EAAlBxnC,mBAEpBynC,EAAW1nE,YAAYtO,MAC7B,GAAIwuC,GACEvyC,KAAK64E,gBAAiB,CAClBmB,IAAAA,EAAaznC,EAAmBvyC,KAAK24E,mBACrCY,EAAgBQ,EAAW/5E,KAAK64E,gBACtC74E,KAAKi6E,YAAYD,EAAYznC,EAAkBD,EAAoBinC,GAGvEv5E,KAAK24E,mBAAqBpmC,EAC1BvyC,KAAK64E,gBAAkBkB,KACxB,CAAA74E,IAAA,UAAAC,MAED,WACEnB,KAAKg5E,eACN,CAAA,CAAA93E,IAAA,aAAAK,IA5HD,WACS,MAAA,cACR,CAAAL,IAAA,gBAAAK,IAED,WACS,MAAA,CACLoyE,UAAU,EACVwF,KAAM,IACNS,WAAY,EACZD,YAAa,OAEhBjB,GAZoCnpD,IC+BvC/O,GAAKlD,ICzCU,CACbI,KAAM,QACNE,KAAM,CACJzI,YAAa,CACX0I,QAAS,CACPnI,KAAM,EACNM,IAAK,UAEP8H,IAAK,CACHpI,KAAM,EACNM,IAAK,SAEP+H,MAAO,CACLrI,KAAM,EACNM,IAAK,QAEP/M,OAAQ,CACNyM,KAAM,EACNM,IAAK,QAEPgI,QAAS,CACPtI,KAAM,EACNM,IAAK,QAEPiI,QAAS,CACPvI,KAAM,EACNM,IAAK,QAEPkI,QAAS,CACPxI,KAAM,EACNM,IAAK,QAEPmI,MAAO,CACLzI,KAAM,EACNM,IAAK,SAGToI,aAAc,mBACdC,cAAe,eACfC,kBAAmB,oCACnBC,iBAAkB,kBAClBC,iBAAkB,aAClBC,cAAe,aACfC,aAAc,0BACdC,gBAAiB,YACjBC,kBAAmB,aACnBC,kBAAmB,YACnBC,kBAAmB,OACnBC,iBAAkB,OAClBC,4BAA6B,cAC7BvH,OAAQ,KACRpB,MAAO,cACP4I,UAAW,KACXC,WAAY,KACZC,cAAe,MACfC,cAAe,KACfC,YAAa,KACbC,YAAa,OACbC,gBAAiB,OACjBC,oBAAqB,OACrBC,mBAAoB,SACpBC,uBAAwB,SACxBC,UAAW,KACXC,cAAe,KACfC,IAAK,MACLC,WAAY,KACZC,KAAM,OACNC,IAAK,KACLC,KAAM,KACNC,UAAW,YACXC,WAAY,MACZC,aAAc,MACdC,QAAS,KACTC,QAAS,MACTC,SAAU,QDjCF,IAES25D,GAAaj5E,GAChC,SAAAi5E,EAAa/3E,EAASytB,GAAc,IAAAuqD,EAAAC,EAAAC,EAAAr5E,OAAAk5E,GAC5BI,IAAAA,EAAe1qD,GAAsD,WAAtCA,EAAa2N,qBAC1CH,EAAWxN,EAAXwN,OAGFm9C,EAAYn6E,GAAAA,OAFCg9B,EAAS,GAAK,CAACo9C,GAAc1hC,GAAUo3B,GAAcvE,GAAiB8O,KAEpDjtB,GAAUktB,GAC7CC,GAAYjc,GAAcgJ,GAAgBkT,GAAkBC,GAAcC,GAAgB17B,GAAQ27B,KAE9FC,EAAS,CAACz2B,GAAQI,GAAQW,GAAOmT,GAAS9R,GAAO7xB,GAAO2zC,GAAQoG,GAAWoM,IAEjFj7E,KAAK0uB,QAAO,CAAIukD,GAAOiI,IAAQ96E,OAAA2K,EAAKwvE,GAAiBS,GAAQ1F,GAASkB,KAChE//C,IAAAA,EAAO6jD,EAAe,SAAWp5D,GAAQC,OACvCsV,OAAAA,GACD,IAAA,MACH0jD,OAAKzrD,SAAQ/mB,KAAIxH,MAAAg6E,EAAI,CAACxkB,GAAU/4B,GAAI+W,GAAeqjC,GAAW0B,KAC9D,MACG,IAAA,UACH0B,EAAAp6E,KAAK0uB,SAAQ/mB,KAAIxH,MAAAi6E,EAAI,CAACe,KACtB,MAAA,SAEAd,EAAIr6E,KAAC0uB,SAAQ/mB,KAAIxH,MAAAk6E,EAAI,CAAC1kB,GAAU/4B,GAAI+W,MAEpCzyB,GAAQE,GAAGoB,QAAmB,OAATiU,IAClB/H,KAAAA,QAAQ/mB,KAAK2oE,IAEhBpvD,GAAQE,GAAGoB,QACRkM,KAAAA,QAAQ/mB,KAAKi1B,IAEpB58B,KAAK2+B,QAAU,GACf3+B,KAAKoV,KAAO,MEtDVgmE,YAAYC,GAAAp/D,EAAAm/D,EAAAC,GAAAn/D,IAAAA,EAAAC,EAAAi/D,GAAA,SAAAA,IAAAl/D,OAAAlb,OAAAo6E,GAAAl/D,EAAA/b,MAAAH,KAAAL,WAAA,OAAAsB,EAAAm6E,IAASv5C,WAArBu5C,EAAAA,GAAY,gBACOz3C,IADnBy3C,EAAAA,GAAY,OAEFtlE,GAFVslE,EAAAA,GAAY,UAGCj0D,IAHbi0D,EAAAA,GAAY,SAIA1mE,GAJZ0mE,EAAAA,GAAY,SAKA3hE,IALZ2hE,EAAAA,GAAY,SAMApnD,IANZonD,EAAAA,GAAY,aAOI7rD,IAPhB6rD,EAAAA,GAAY,OAQF56D,IARV46D,EAAAA,GAAY,cASK5/C,IATjB4/C,EAAAA,GAAY,cAUKr/D,IAVjBq/D,EAAAA,GAAY,WAaE5tB,IAbd4tB,EAAAA,GAAY,WAcEX,IAddW,EAAAA,GAAY,WAeEtiC,IAfdsiC,EAAAA,GAAY,iBAgBQE,IAhBpBF,EAAAA,GAAY,oBAiBWG,IAjBvBH,EAAAA,GAAY,aAkBII"}
|
|
1
|
+
{"version":3,"file":"index.min.js","sources":["../src/version.js","../src/utils/debug.js","../src/utils/xgplayerTimeRange.js","../src/utils/util.js","../src/error.js","../src/events.js","../../../node_modules/eventemitter3/index.js","../src/instManager.js","../src/lang/en.js","../src/lang/i18n.js","../src/utils/sniffer.js","../src/mediaProxy.js","../src/utils/database.js","../src/constant.js","../src/plugin/hooksDescriptor.js","../src/plugin/basePlugin.js","../../../node_modules/delegate/src/closest.js","../../../node_modules/delegate/src/delegate.js","../src/plugin/plugin.js","../src/plugin/resizeObserver.js","../src/plugin/pluginsManager.js","../src/stateClassMap.js","../src/defaultConfig.js","../src/plugin/preset.js","../src/state.js","../src/plugins/controls/index.js","../src/player.js","../src/plugins/common/iconTools.js","../src/plugins/common/iconPlugin.js","../src/plugins/cssFullScreen/index.js","../src/plugins/fullscreen/backicon.js","../src/plugins/fullscreen/index.js","../src/plugins/play/index.js","../src/plugins/progress/innerList.js","../src/plugins/progress/index.js","../src/plugins/time/index.js","../src/plugins/volume/index.js","../src/plugins/logger/index.js","../src/plugins/replay/index.js","../src/plugins/poster/index.js","../src/plugins/start/index.js","../src/plugins/enter/index.js","../src/plugins/miniScreen/miniScreenIcon.js","../src/utils/draggabilly.js","../src/plugins/miniScreen/index.js","../src/plugins/pc/index.js","../src/plugins/mobile/touch.js","../src/plugins/mobile/index.js","../src/plugins/keyboard/index.js","../src/plugins/loading/index.js","../src/plugins/time/timesegments.js","../src/plugins/rotate/index.js","../src/plugins/pip/index.js","../src/plugins/playNext/index.js","../src/plugins/download/saveAs.js","../src/plugins/download/index.js","../src/plugins/screenShot/index.js","../src/plugins/common/optionList.js","../src/plugins/common/optionsIcon.js","../src/plugins/definition/index.js","../src/plugins/playbackRate/index.js","../src/plugins/error/index.js","../src/plugins/prompt/index.js","../src/plugins/progressPreview/dotsApi.js","../src/plugins/progressPreview/index.js","../src/plugins/common/thumbnail.js","../src/plugins/progress/miniProgress.js","../src/plugins/dynamicBg/index.js","../src/plugins/stats/index.js","../src/plugins/gapJump/index.js","../src/plugins/waitingTimeoutJump/index.js","../src/plugins/testspeed/index.js","../src/plugins/fpsDetect/index.js","../src/presets/default.js","../src/lang/zh-cn.js","../src/index.umd.js"],"sourcesContent":["/**\n * @type {string}\n * */\nexport default __VERSION__\n","\nconst XG_DEBUG_OPEN = typeof (window) !== 'undefined' && window.location && window.location.href.indexOf('xgplayerdebugger=1') > -1\n\nconst STYLE = {\n info: 'color: #525252; background-color: #90ee90;',\n error: 'color: #525252; background-color: red;',\n warn: 'color: #525252; background-color: yellow; '\n}\n\nconst XGTAG = '%c[xgplayer]'\n\nconst XG_DEBUG = {\n config: {\n debug: XG_DEBUG_OPEN ? 3 : 0\n },\n\n logInfo: function (message, ...optionalParams) {\n this.config.debug >= 3 && console.log(XGTAG, STYLE.info, message, ...optionalParams)\n },\n\n logWarn: function (message, ...optionalParams) {\n this.config.debug >= 1 && console.warn(XGTAG, STYLE.warn, message, ...optionalParams)\n },\n\n logError: function (message, ...optionalParams) {\n if (this.config.debug < 1) {\n return\n }\n const _fun = this.config.debug >= 2 ? 'trace' : 'error'\n console[_fun](XGTAG, STYLE.error, message, ...optionalParams)\n }\n}\n\nfunction bindDebug (player) {\n player.logInfo = XG_DEBUG.logInfo.bind(player)\n player.logWarn = XG_DEBUG.logWarn.bind(player)\n player.logError = XG_DEBUG.logError.bind(player)\n}\n\nexport {\n XG_DEBUG as default,\n bindDebug\n}\n","export default class XgplayerTimeRange {\n constructor (bufferedList) {\n this.bufferedList = bufferedList\n }\n\n start (index) {\n return this.bufferedList[index].start\n }\n\n end (index) {\n return this.bufferedList[index].end\n }\n\n get length () {\n return this.bufferedList.length\n }\n}\n","import XG_DEBUG from './debug'\nimport XgplayerTimeRange from './xgplayerTimeRange'\nconst util = {}\n\n/**\n *\n * @param { string } el\n * @param { string } [tpl=]\n * @param { {[propName: string]: any }} [attrs={}]\n * @param { string } [cname='']\n * @returns { HTMLElement | null }\n */\nutil.createDom = function (el = 'div', tpl = '', attrs = {}, cname = '') {\n const dom = document.createElement(el)\n dom.className = cname\n dom.innerHTML = tpl\n Object.keys(attrs).forEach(item => {\n const key = item\n const value = attrs[item]\n if (el === 'video' || el === 'audio' || el === 'live-video') {\n if (value) {\n dom.setAttribute(key, value)\n }\n } else {\n dom.setAttribute(key, value)\n }\n })\n return dom\n}\n\n/**\n *\n * @param { string } html\n * @param { {[propName: string]: any} } [attrs={}]\n * @param { string } [classname=\"\"]\n * @returns { HTMLElement | null }\n */\nutil.createDomFromHtml = function (html, attrs = {}, classname = '') {\n try {\n let doc = document.createElement('div')\n doc.innerHTML = html\n let dom = doc.children\n doc = null\n if (dom.length > 0) {\n dom = dom[0]\n classname && util.addClass(dom, classname)\n if (attrs) {\n Object.keys(attrs).forEach(key => {\n dom.setAttribute(key, attrs[key])\n })\n }\n return dom\n }\n return null\n } catch (err) {\n XG_DEBUG.logError('util.createDomFromHtml', err)\n return null\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { boolean }\n */\nutil.hasClass = function (el, className) {\n if (!el || !className) {\n return false\n }\n try {\n return Array.prototype.some.call(el.classList, item => item === className)\n } catch (e) {\n const orgClassName = el.className && typeof el.className === 'object' ? el.getAttribute('class') : el.className\n return orgClassName && !!orgClassName.match(new RegExp('(\\\\s|^)' + className + '(\\\\s|$)'))\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.addClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.add(item)\n })\n } catch (e) {\n if (!util.hasClass(el, className)) {\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class') + ' ' + className)\n } else {\n el.className += ' ' + className\n }\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.removeClass = function (el, className) {\n if (!el || !className) {\n return\n }\n try {\n className.replace(/(^\\s+|\\s+$)/g, '').split(/\\s+/g).forEach(item => {\n item && el.classList.remove(item)\n })\n } catch (e) {\n if (util.hasClass(el, className)) {\n className.split(/\\s+/g).forEach(item => {\n const reg = new RegExp('(\\\\s|^)' + item + '(\\\\s|$)')\n if (el.className && typeof el.className === 'object') {\n el.setAttribute('class', el.getAttribute('class').replace(reg, ' '))\n } else {\n el.className = el.className.replace(reg, ' ')\n }\n })\n }\n }\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } className\n * @returns { void }\n */\nutil.toggleClass = function (el, className) {\n if (!el) {\n return\n }\n\n className.split(/\\s+/g).forEach(item => {\n if (util.hasClass(el, item)) {\n util.removeClass(el, item)\n } else {\n util.addClass(el, item)\n }\n })\n}\n\n/**\n *\n * @param { string | Object } args0\n * @param { string } [className]\n * @returns { string }\n */\nutil.classNames = function () {\n const classname = []\n for (let i = 0; i < arguments.length; i++) {\n if (util.typeOf(arguments[i]) === 'String') {\n // classname += `${arguments[i]}`\n classname.push(arguments[i])\n } else if (util.typeOf(arguments[i]) === 'Object') {\n Object.keys(arguments[i]).map(key => {\n if (arguments[i][key]) {\n // classname += key\n classname.push(key)\n }\n })\n }\n // if (i < arguments.length - 1) {\n // classname += ' '\n // }\n }\n return classname.join(' ')\n}\n\n/**\n *\n * @param { HTMLElement } el\n * @param { string } sel\n * @returns { HTMLElement }\n */\nutil.findDom = function (el = document, sel) {\n let dom\n // fix querySelector IDs that start with a digit\n // https://stackoverflow.com/questions/37270787/uncaught-syntaxerror-failed-to-execute-queryselector-on-document\n try {\n dom = el.querySelector(sel)\n } catch (e) {\n XG_DEBUG.logError('util.findDom', e)\n if (sel.indexOf('#') === 0) {\n dom = el.getElementById(sel.slice(1))\n }\n }\n return dom\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } key\n * @returns { any }\n */\nutil.getCss = function (dom, key) {\n return dom.currentStyle ? dom.currentStyle[key] : document.defaultView.getComputedStyle(dom, false)[key]\n}\n\nutil.padStart = function (str, length, pad) {\n const charstr = String(pad)\n const len = length >> 0\n let maxlen = Math.ceil(len / charstr.length)\n const chars = []\n const r = String(str)\n while (maxlen--) {\n chars.push(charstr)\n }\n return chars.join('').substring(0, len - r.length) + r\n}\n\n/**\n *\n * @param { number } time\n * @returns { string }\n */\nutil.format = function (time) {\n if (window.isNaN(time)) {\n return ''\n }\n time = Math.round(time)\n const hour = util.padStart(Math.floor(time / 3600), 2, 0)\n const minute = util.padStart(Math.floor((time - hour * 3600) / 60), 2, 0)\n const second = util.padStart(Math.floor((time - hour * 3600 - minute * 60)), 2, 0)\n return (hour === '00' ? [minute, second] : [hour, minute, second]).join(':')\n}\n\n/**\n *\n * @param { Object } e\n * @returns { Object }\n */\nutil.event = function (e) {\n if (e.touches) {\n const touch = e.touches[0] || e.changedTouches[0]\n e.clientX = touch.clientX || 0\n e.clientY = touch.clientY || 0\n e.offsetX = touch.pageX - touch.target.offsetLeft\n e.offsetY = touch.pageY - touch.target.offsetTop\n }\n e._target = e.target || e.srcElement\n}\n\n/**\n *\n * @param { any } obj\n * @returns { string }\n */\nutil.typeOf = function (obj) {\n // eslint-disable-next-line no-lookahead-lookbehind-regexp/no-lookahead-lookbehind-regexp\n return Object.prototype.toString.call(obj).match(/([^\\s.*]+)(?=]$)/g)[0]\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepCopy = function (dst, src) {\n if (util.typeOf(src) === 'Object' && util.typeOf(dst) === 'Object') {\n Object.keys(src).forEach(key => {\n // eslint-disable-next-line no-undef\n if (util.typeOf(src[key]) === 'Object' && !(src[key] instanceof Node)) {\n if (dst[key] === undefined || dst[key] === undefined) {\n dst[key] = src[key]\n } else {\n util.deepCopy(dst[key], src[key])\n }\n } else if (util.typeOf(src[key]) === 'Array') {\n dst[key] = util.typeOf(dst[key]) === 'Array' ? dst[key].concat(src[key]) : src[key]\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n }\n}\n\n/**\n *\n * @param { any } dst\n * @param { any } src\n * @returns { any }\n */\nutil.deepMerge = function (dst, src) {\n Object.keys(src).map(key => {\n if (util.typeOf(src[key]) === 'Array' && util.typeOf(dst[key]) === 'Array') {\n if (util.typeOf(dst[key]) === 'Array') {\n dst[key].push(...src[key])\n }\n } else if (util.typeOf(dst[key]) === util.typeOf(src[key]) && dst[key] !== null && util.typeOf(dst[key]) === 'Object' && !(src[key] instanceof window.Node)) {\n util.deepMerge(dst[key], src[key])\n } else {\n src[key] !== null && (dst[key] = src[key])\n }\n })\n return dst\n}\n\nutil.getBgImage = function (el) {\n // fix: return current page url when url is none\n const url = (el.currentStyle || window.getComputedStyle(el, null)).backgroundImage\n if (!url || url === 'none') {\n return ''\n }\n const a = document.createElement('a')\n a.href = url.replace(/url\\(\"|\"\\)/g, '')\n return a.href\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { HTMLElement | null }\n */\nutil.copyDom = function (dom) {\n if (dom && dom.nodeType === 1) {\n const back = document.createElement(dom.tagName)\n Array.prototype.forEach.call(dom.attributes, (node) => {\n back.setAttribute(node.name, node.value)\n })\n if (dom.innerHTML) {\n back.innerHTML = dom.innerHTML\n }\n return back\n } else {\n return ''\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @param { function } intervalFunc\n * @param { number } frequency\n */\nutil.setInterval = function (context, eventName, intervalFunc, frequency) {\n if (!context._interval[eventName]) {\n context._interval[eventName] = window.setInterval(intervalFunc.bind(context), frequency)\n }\n}\n\n/**\n *\n * @param { any } context\n * @param { string } eventName\n * @returns { void }\n */\nutil.clearInterval = function (context, eventName) {\n clearInterval(context._interval[eventName])\n context._interval[eventName] = null\n}\n\n/**\n *\n * @param { any } context\n * @param { function } fun\n * @param { number } time\n * @returns { number }\n */\nutil.setTimeout = function (context, fun, time) {\n if (!context._timers) {\n context._timers = []\n }\n const id = setTimeout(() => {\n fun()\n util.clearTimeout(context, id)\n }, time)\n context._timers.push(id)\n return id\n}\n\n/**\n *\n * @param { any } context\n * @param { number } id\n */\nutil.clearTimeout = function (context, id) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n for (let i = 0; i < _timers.length; i++) {\n if (_timers[i] === id) {\n _timers.splice(i, 1)\n clearTimeout(id)\n break\n }\n }\n } else {\n clearTimeout(id)\n }\n}\n\n/**\n *\n * @param { any } context\n */\nutil.clearAllTimers = function (context) {\n const { _timers } = context\n if (util.typeOf(_timers) === 'Array') {\n _timers.map(item => {\n clearTimeout(item)\n })\n context._timerIds = []\n }\n}\n\n/**\n *\n * @param { string } name\n * @param { string } imgUrl\n * @param { number } [width]\n * @param { number } [height]\n * @returns { HTMLElement }\n */\nutil.createImgBtn = function (name, imgUrl, width, height) {\n const btn = util.createDom(`xg-${name}`, '', {}, `xgplayer-${name}-img`)\n btn.style.backgroundImage = `url(\"${imgUrl}\")`\n if (width && height) {\n let w, h, unit\n ['px', 'rem', 'em', 'pt', 'dp', 'vw', 'vh', 'vm', '%'].every((item) => {\n if (width.indexOf(item) > -1 && height.indexOf(item) > -1) {\n w = parseFloat(width.slice(0, width.indexOf(item)).trim())\n h = parseFloat(height.slice(0, height.indexOf(item)).trim())\n unit = item\n return false\n } else {\n return true\n }\n })\n btn.style.width = `${w}${unit}`\n btn.style.height = `${h}${unit}`\n btn.style.backgroundSize = `${w}${unit} ${h}${unit}`\n if (name === 'start') {\n btn.style.margin = `-${h / 2}${unit} auto auto -${w / 2}${unit}`\n } else {\n btn.style.margin = 'auto 5px auto 5px'\n }\n }\n return btn\n}\n\n/**\n *\n * @param { string } hex\n * @param { string | number } alpha\n * @returns { string }\n */\nutil.Hex2RGBA = function (hex, alpha) {\n const rgb = [] // 定义rgb数组\n // eslint-disable-next-line no-useless-escape\n if (/^\\#[0-9A-F]{3}$/i.test(hex)) {\n let sixHex = '#'\n hex.replace(/[0-9A-F]/ig, function (kw) {\n sixHex += kw + kw\n })\n hex = sixHex\n }\n if (/^#[0-9A-F]{6}$/i.test(hex)) {\n hex.replace(/[0-9A-F]{2}/ig, function (kw) {\n rgb.push(parseInt(kw, 16))\n })\n return `rgba(${rgb.join(',')}, ${alpha})`\n } else {\n return 'rgba(255, 255, 255, 0.1)'\n }\n}\n\n/**\n *\n * @returns { HTMLElement | null }\n */\nutil.getFullScreenEl = function () {\n return document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsFunction = function (fun) {\n return fun && typeof fun === 'function'\n}\n\n/**\n * @param { any }\n * @returns { boolean }\n */\nutil.checkIsObject = function (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\n/**\n * @param { HTMLElement }\n */\nutil.hide = function (dom) {\n dom.style.display = 'none'\n}\n\n/**\n * @param { HTMLElement }\n * @param { block | flex | inline-block | inline-flex } [display]\n */\nutil.show = function (dom, display) {\n dom.style.display = display || 'block'\n}\n\n/**\n *\n * @param { any } val\n * @returns { boolean }\n */\nutil.isUndefined = function (val) {\n if (typeof val === 'undefined' || val === null) {\n return true\n }\n}\n\nutil.isNotNull = function (val) {\n return !(val === undefined || val === null)\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { string } [text]\n * @returns\n */\nutil.setStyleFromCsstext = function (dom, text) {\n // dom.setAttribute(style, text)\n if (!text) {\n return\n }\n if (util.typeOf(text) === 'String') {\n const styleArr = text.replace(/\\s+/g, '').split(';')\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n dom.style[arr[0]] = arr[1]\n }\n }\n })\n } else {\n Object.keys(text).map(key => {\n dom.style[key] = text[key]\n })\n }\n}\n\n/**\n *\n * @param { string } key\n * @param { Array<any>} list\n * @returns { boolean }\n */\nfunction checkIsIn (key, list) {\n for (let i = 0, len = list.length; i < len; i++) {\n if (key.indexOf(list[i]) > -1) {\n return true\n }\n }\n return false\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @param { Array<string> } [list] attribute names to filter\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.filterStyleFromText = function (dom, list = ['width', 'height', 'top', 'left', 'bottom', 'right', 'position', 'z-index', 'padding', 'margin', 'transform']) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n const remain = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n if (checkIsIn(arr[0], list)) {\n ret[arr[0]] = arr[1]\n // dom.style[arr[0]] = 'initial'\n } else {\n remain[arr[0]] = arr[1]\n }\n }\n }\n })\n dom.setAttribute('style', '')\n Object.keys(remain).map(key => {\n // netStyle += `${key}: ${remain[key]};`\n dom.style[key] = remain[key]\n })\n return ret\n}\n\n/**\n *\n * @param { HTMLElement } dom\n * @returns { {} | {[propName: string]: any;} }\n */\nutil.getStyleFromCsstext = function (dom) {\n const _cssText = dom.style.cssText\n if (!_cssText) {\n return {}\n }\n const styleArr = _cssText.replace(/\\s+/g, '').split(';')\n const ret = {}\n styleArr.map(item => {\n if (item) {\n const arr = item.split(':')\n if (arr.length > 1) {\n ret[arr[0]] = arr[1]\n }\n }\n })\n return ret\n}\n\nutil.preloadImg = (url, onload = () => {}, onerror = () => {}) => {\n if (!url) {\n return\n }\n let img = new window.Image()\n img.onload = (e) => {\n img = null\n onload && onload(e)\n }\n img.onerror = (e) => {\n img = null\n onerror && onerror(e)\n }\n img.src = url\n}\n\nutil.stopPropagation = (e) => {\n if (e) {\n e.stopPropagation()\n }\n}\n\nutil.scrollTop = function () {\n return window.pageYOffset ||\n document.documentElement.scrollTop ||\n document.body.scrollTop ||\n 0\n}\n\nutil.scrollLeft = function () {\n return window.pageXOffset ||\n document.documentElement.scrollLeft ||\n document.body.scrollLeft ||\n 0\n}\n\nutil.checkTouchSupport = function () {\n return 'ontouchstart' in window\n}\n\nutil.getBuffered2 = (vbuffered, maxHoleDuration = 0.5) => { // ref: hls.js\n const buffered = []\n for (let i = 0; i < vbuffered.length; i++) {\n buffered.push({ start: vbuffered.start(i) < 0.5 ? 0 : vbuffered.start(i), end: vbuffered.end(i) })\n }\n buffered.sort(function (a, b) {\n const diff = a.start - b.start\n if (diff) {\n return diff\n } else {\n return b.end - a.end\n }\n })\n let buffered2 = []\n if (maxHoleDuration) {\n for (let i = 0; i < buffered.length; i++) {\n const buf2len = buffered2.length\n if (buf2len) {\n const buf2end = buffered2[buf2len - 1].end\n if ((buffered[i].start - buf2end) < maxHoleDuration) {\n if (buffered[i].end > buf2end) {\n buffered2[buf2len - 1].end = buffered[i].end\n }\n } else {\n buffered2.push(buffered[i])\n }\n } else {\n buffered2.push(buffered[i])\n }\n }\n } else {\n buffered2 = buffered\n }\n return new XgplayerTimeRange(buffered2)\n}\n\n/**\n * @description css中有zoom的时候,位移会等比缩放,但是元素的宽高不会等比缩放,所以通过该api做统一\n * https://bugs.chromium.org/p/chromium/issues/detail?id=429140#c8\n * @param {Event} e\n * @param {number} zoom\n * @returns\n */\nutil.getEventPos = function (e, zoom = 1) {\n if (e.touches && e.touches.length > 0) {\n e = e.touches[0]\n }\n return {\n x: e.x / zoom,\n y: e.y / zoom,\n clientX: e.clientX / zoom,\n clientY: e.clientY / zoom,\n offsetX: e.offsetX / zoom,\n offsetY: e.offsetY / zoom,\n pageX: e.pageX / zoom,\n pageY: e.pageY / zoom\n }\n}\n\nutil.requestAnimationFrame = function (callback) {\n const _fun = window.requestAnimationFrame ||\n // Older versions Chrome/Webkit\n window.webkitRequestAnimationFrame ||\n\n // Firefox < 23\n window.mozRequestAnimationFrame ||\n\n // opera\n window.oRequestAnimationFrame ||\n\n // ie\n window.msRequestAnimationFrame\n if (_fun) {\n return _fun(callback)\n }\n}\n\nutil.getHostFromUrl = function (url) {\n if (util.typeOf(url) !== 'String') {\n return ''\n }\n const results = url.split('/') // 以“/”进行分割\n let domain = ''\n if (results.length > 3 && results[2]) {\n domain = results[2]\n }\n return domain\n}\n\nutil.cancelAnimationFrame = function (frameId) {\n const _fun = window.cancelAnimationFrame || window.mozCancelAnimationFrame || window.cancelRequestAnimationFrame\n _fun && _fun(frameId)\n}\n\n/**\n * @desc Check whether it is MediaSource start\n * @param { HTMLVideoElement | HTMLAudioElement | HTMLElement } video\n * @returns { boolean }\n */\nutil.isMSE = function (video) {\n if (video.media) {\n video = video.media\n }\n if (!video || !(video instanceof HTMLMediaElement)) {\n return false\n }\n return /^blob/.test(video.currentSrc) || /^blob/.test(video.src)\n}\n\nutil.isBlob = function (url) {\n return typeof url === 'string' && /^blob/.test(url)\n}\n\n/**\n * @param { number } did\n * @returns { string }\n */\nutil.generateSessionId = function (did = 0) {\n let d = new Date().getTime()\n try {\n did = parseInt(did)\n } catch (e) {\n did = 0\n }\n d += did\n if (window.performance && typeof window.performance.now === 'function') {\n d += parseInt(window.performance.now()) // use high-precision timer if available\n }\n const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n const r = (d + Math.random() * 16) % 16 | 0\n d = Math.floor(d / 16)\n return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16)\n })\n return uuid\n}\n\nutil.createEvent = function (eventName) {\n let event\n if (typeof window.Event === 'function') {\n event = new Event(eventName)\n } else {\n event = document.createEvent('Event')\n event.initEvent(eventName, true, true)\n }\n return event\n}\n\n/**\n * @description Adjust currentTime according to duration, when ended is true and currentTime is less than duration, or\n * currentTime is greater than duration, return duration\n * @param { number } time\n * @param { number } duration\n * @param { boolean } isEnded\n * @returns { number } Adjusted time\n */\nutil.adjustTimeByDuration = function (time, duration, isEnded) {\n if (!duration || !time) {\n return time\n }\n if (time > duration || (isEnded && time < duration)) {\n return duration\n }\n return time\n}\n\nutil.createPositionBar = function (className, root) {\n const dom = util.createDom(\n 'xg-bar',\n '',\n { 'data-index': -1 },\n className\n )\n root.appendChild(dom)\n return dom\n}\n\nutil.getTransformStyle = function (pos = { x: 0, y: 0, scale: 1, rotate: 0 }, transformValue = '') {\n const styles = {\n scale: `${pos.scale || 1}`,\n translate: `${pos.x || 0}%, ${pos.y || 0}%`,\n rotate: `${pos.rotate || 0}deg`\n }\n const stylesKeys = Object.keys(styles)\n\n // 只复写Transform中已知的函数,对于其他函数不修改。解决全屏或者rotate插件执行时,对于镜像插件的影响\n stylesKeys.forEach((key) => {\n const reg = new RegExp(`${key}\\\\([^\\\\(]+\\\\)`, 'g') // reg match: TransformFunc(values)\n const fn = `${key}(${styles[key]})`\n if (reg.test(transformValue)) {\n reg.lastIndex = -1\n transformValue = transformValue.replace(reg, fn)\n } else {\n transformValue += `${fn} `\n }\n })\n return transformValue\n}\n\n/**\n * @description 角度换算\n * @param {number} val\n * @returns {number}\n */\nutil.convertDeg = function (val) {\n if (Math.abs(val) <= 1) {\n return val * 360\n }\n return val % 360\n}\n\nutil.getIndexByTime = function (time, segments) {\n const _len = segments.length\n let _index = -1\n if (_len < 1) {\n return _index\n }\n if (time <= segments[0].end || _len < 2) {\n _index = 0\n } else if (time > segments[_len - 1].end) {\n _index = _len - 1\n } else {\n for (let i = 1; i < _len; i++) {\n if (time > segments[i - 1].end && time <= segments[i].end){\n _index = i\n break\n }\n }\n }\n return _index\n}\nutil.getOffsetCurrentTime = function (currentTime, segments, index = -1) {\n let _index = -1\n if (index >= 0 && index < segments.length) {\n _index = index\n } else {\n _index = util.getIndexByTime(currentTime, segments)\n }\n if (_index < 0) {\n return -1\n }\n const _len = segments.length\n const { start, end, cTime, offset } = segments[_index]\n if (currentTime < start) {\n return cTime\n } else if (currentTime >= start && currentTime <= end) {\n return currentTime - offset\n } else if (currentTime > end && _index >= _len - 1) {\n return end\n }\n return -1\n}\n\n/**\n *\n * @param {*} offsetTime\n * @param {*} segments\n * @returns\n */\nutil.getCurrentTimeByOffset = function (offsetTime, segments) {\n let _index = -1\n if (!segments || segments.length < 0) {\n return offsetTime\n }\n for (let i = 0; i < segments.length; i++) {\n if (offsetTime <= segments[i].duration) {\n _index = i\n break\n }\n }\n if (_index !== -1) {\n const { start } = segments[_index]\n if (_index - 1 < 0) {\n return start + offsetTime\n } else {\n return start + (offsetTime - segments[_index - 1].duration)\n }\n }\n return offsetTime\n}\n\nfunction isObject (value) {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\nfunction debounce (func, wait, options) {\n let lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime\n\n let lastInvokeTime = 0\n let leading = false\n let maxing = false\n let trailing = true\n\n // Bypass `requestAnimationFrame` by explicitly setting `wait=0`.\n const useRAF = (!wait && wait !== 0 && typeof window.requestAnimationFrame === 'function')\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n wait = +wait || 0\n if (isObject(options)) {\n leading = !!options.leading\n maxing = 'maxWait' in options\n maxWait = maxing ? Math.max(+options.maxWait || 0, wait) : maxWait\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n\n function invokeFunc (time) {\n const args = lastArgs\n const thisArg = lastThis\n\n lastArgs = lastThis = undefined\n lastInvokeTime = time\n result = func.apply(thisArg, args)\n return result\n }\n\n function startTimer (pendingFunc, wait) {\n if (useRAF) {\n window.cancelAnimationFrame(timerId)\n return window.requestAnimationFrame(pendingFunc)\n }\n return setTimeout(pendingFunc, wait)\n }\n\n function cancelTimer (id) {\n if (useRAF) {\n return window.cancelAnimationFrame(id)\n }\n clearTimeout(id)\n }\n\n function leadingEdge (time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time\n // Start the timer for the trailing edge.\n timerId = startTimer(timerExpired, wait)\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result\n }\n\n function remainingWait (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n const timeWaiting = wait - timeSinceLastCall\n\n return maxing\n ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting\n }\n\n function shouldInvoke (time) {\n const timeSinceLastCall = time - lastCallTime\n const timeSinceLastInvoke = time - lastInvokeTime\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait))\n }\n\n function timerExpired () {\n const time = Date.now()\n if (shouldInvoke(time)) {\n return trailingEdge(time)\n }\n // Restart the timer.\n timerId = startTimer(timerExpired, remainingWait(time))\n }\n\n function trailingEdge (time) {\n timerId = undefined\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time)\n }\n lastArgs = lastThis = undefined\n return result\n }\n\n function cancel () {\n if (timerId !== undefined) {\n cancelTimer(timerId)\n }\n lastInvokeTime = 0\n lastArgs = lastCallTime = lastThis = timerId = undefined\n }\n\n function flush () {\n return timerId === undefined ? result : trailingEdge(Date.now())\n }\n\n function pending () {\n return timerId !== undefined\n }\n\n function debounced (...args) {\n const time = Date.now()\n const isInvoking = shouldInvoke(time)\n\n lastArgs = args\n lastThis = this\n lastCallTime = time\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime)\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = startTimer(timerExpired, wait)\n return invokeFunc(lastCallTime)\n }\n }\n if (timerId === undefined) {\n timerId = startTimer(timerExpired, wait)\n }\n return result\n }\n debounced.cancel = cancel\n debounced.flush = flush\n debounced.pending = pending\n return debounced\n}\n\nfunction throttle (func, wait, options) {\n let leading = true\n let trailing = true\n\n if (typeof func !== 'function') {\n throw new TypeError('Expected a function')\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading\n trailing = 'trailing' in options ? !!options.trailing : trailing\n }\n return debounce(func, wait, {\n leading,\n trailing,\n maxWait: wait\n })\n}\n\n/**\n * @returns { string }\n */\nfunction getLang () {\n let lang = (document.documentElement.getAttribute('lang') || navigator.language || 'zh-cn').toLocaleLowerCase()\n if (lang === 'zh-cn') {\n lang = 'zh'\n }\n return lang\n}\n\nfunction checkIsCurrentVideo (element, playerId, key) {\n if (!element) {\n return\n }\n const pid = element.getAttribute(key)\n if (pid && pid === playerId && (element.tagName === 'VIDEO' || element.tagName === 'AUDIO')) {\n return true\n }\n return false\n}\n\nexport {\n util as default,\n checkIsCurrentVideo,\n debounce,\n throttle,\n getLang\n}\n","// eslint-disable-next-line no-undef\nimport version from './version'\nimport Util from './utils/util'\n/**\n * @typedef { import ('./player').default } Player\n */\n\nconst ERROR_TYPE_MAP = {\n 1: 'media',\n 2: 'media',\n 3: 'media',\n 4: 'media',\n 5: 'media',\n 6: 'media'\n}\n\nconst ERROR_MAP = {\n 1: 5101,\n 2: 5102,\n 3: 5103,\n 4: 5104,\n 5: 5105,\n 6: 5106\n}\n\nconst ErrorTypes = {\n network: {\n code: 1\n },\n mse: {\n code: 2\n },\n parse: {\n code: 3\n },\n format: {\n code: 4\n },\n decoder: {\n code: 5\n },\n runtime: {\n code: 6\n },\n timeout: {\n code: 7\n },\n drm: {\n code: 8\n },\n ad: {\n code: 9\n },\n other: {\n code: 1000\n }\n}\n\n/**\n * @typedef { {\n * playerVersion: string,\n * currentTime: number,\n * duration: number,\n * ended: boolean,\n * readyState: number,\n * networkState: number,\n * src: any,\n * errorType: string,\n * errorCode: number,\n * message: string,\n * mediaError?: {\n * code: number,\n * message?: string\n * },\n * originError?: any,\n * url?: any,\n * host?: string,\n * [propName: string]: any\n * } } IError\n */\n\n/**\n * @type { IError }\n */\nclass Errors {\n /**\n *\n * @param { Player } player\n * @param { {\n * errorType: string,\n * errorCode: number,\n * errorMessage: string,\n * originError: any,\n * ext: { [propName: string]: any; }\n * } } errorInfo\n * @returns\n */\n constructor (player, errorInfo = { errorType: '', errorCode: 0, errorMessage: '', originError: '', ext: {}, mediaError: null }) {\n const ERROR_TYPES = player && player.i18n ? player.i18n.ERROR_TYPES : null\n if (player.media) {\n const mediaError = errorInfo.mediaError ? errorInfo.mediaError : (player.media.error || {})\n const { duration, currentTime, ended, src, currentSrc } = player\n const { readyState, networkState } = player.media\n let _errc = errorInfo.errorCode || mediaError.code\n if (ERROR_MAP[_errc]) {\n _errc = ERROR_MAP[_errc]\n }\n const r = {\n playerVersion: version,\n currentTime,\n duration,\n ended,\n readyState,\n networkState,\n src: src || currentSrc,\n errorType: errorInfo.errorType,\n errorCode: _errc,\n message: errorInfo.errorMessage || mediaError.message,\n mediaError,\n originError: errorInfo.originError ? errorInfo.originError.stack : '',\n host: Util.getHostFromUrl(src || currentSrc)\n }\n errorInfo.ext && Object.keys(errorInfo.ext).map(key => {\n r[key] = errorInfo.ext[key]\n })\n return r\n } else {\n if (arguments.length > 1) {\n const r = {\n playerVersion: version,\n domain: document.domain\n }\n const arr = ['errorType', 'currentTime', 'duration', 'networkState', 'readyState', 'src', 'currentSrc', 'ended', 'errd', 'errorCode', 'mediaError']\n for (let i = 0; i < arguments.length; i++) {\n r[arr[i]] = arguments[i]\n }\n r.ex = ERROR_TYPES ? (ERROR_TYPES[arguments[0]] || {}).msg : ''// 补充信息\n return r\n }\n }\n }\n}\n\nexport {\n Errors as default,\n ErrorTypes,\n ERROR_TYPE_MAP\n}\n","export const PLAY = 'play'\nexport const PLAYING = 'playing'\nexport const ENDED = 'ended'\nexport const PAUSE = 'pause'\nexport const ERROR = 'error'\nexport const SEEKING = 'seeking'\nexport const SEEKED = 'seeked'\nexport const TIME_UPDATE = 'timeupdate'\nexport const WAITING = 'waiting'\nexport const CANPLAY = 'canplay'\nexport const CANPLAY_THROUGH = 'canplaythrough'\nexport const DURATION_CHANGE = 'durationchange'\nexport const VOLUME_CHANGE = 'volumechange'\nexport const LOADED_DATA = 'loadeddata'\nexport const LOADED_METADATA = 'loadedmetadata'\nexport const RATE_CHANGE = 'ratechange'\nexport const PROGRESS = 'progress'\nexport const LOAD_START = 'loadstart'\nexport const EMPTIED = 'emptied'\nexport const STALLED = 'stalled'\nexport const SUSPEND = 'suspend'\nexport const ABORT = 'abort'\n\n// player events\nexport const BUFFER_CHANGE = 'bufferedChange'\nexport const PLAYER_FOCUS = 'focus'\nexport const PLAYER_BLUR = 'blur'\nexport const READY = 'ready'\nexport const URL_NULL = 'urlNull'\nexport const AUTOPLAY_STARTED = 'autoplay_started'\nexport const AUTOPLAY_PREVENTED = 'autoplay_was_prevented'\nexport const COMPLETE = 'complete'\nexport const REPLAY = 'replay'\nexport const DESTROY = 'destroy'\nexport const URL_CHANGE = 'urlchange'\nexport const DOWNLOAD_SPEED_CHANGE = 'download_speed_change'\nexport const LEAVE_PLAYER = 'leaveplayer'\nexport const ENTER_PLAYER = 'enterplayer'\nexport const LOADING = 'loading'\n\n// screen change evnets\nexport const FULLSCREEN_CHANGE = 'fullscreen_change'\nexport const CSS_FULLSCREEN_CHANGE = 'cssFullscreen_change'\nexport const MINI_STATE_CHANGE = 'mini_state_change'\n\nexport const DEFINITION_CHANGE = 'definition_change'\nexport const BEFORE_DEFINITION_CHANGE = 'before_definition_change'\nexport const AFTER_DEFINITION_CHANGE = 'after_definition_change'\n\n// transmuxer events\nexport const SEI_PARSED = 'SEI_PARSED'\n\nexport const RETRY = 'retry'\n\n// 容器宽高变化\nexport const VIDEO_RESIZE = 'video_resize'\n\n// picture-in-picture状态变化\nexport const PIP_CHANGE = 'pip_change'\n\n// rotate change\nexport const ROTATE = 'rotate'\n\n// screenShot\nexport const SCREEN_SHOT = 'screenShot'\n\n// play next\nexport const PLAYNEXT = 'playnext'\n\nexport const SHORTCUT = 'shortcut'\n\nexport const XGLOG = 'xglog'\n\nexport const USER_ACTION = 'user_action'\n\nexport const RESET = 'reset'\n\nexport const SOURCE_ERROR = 'source_error'\n\nexport const SOURCE_SUCCESS = 'source_success'\n\nexport const SWITCH_SUBTITLE = 'switch_subtitle'\n\nexport const VIDEO_EVENTS = [\n 'play',\n 'playing',\n 'ended',\n 'pause',\n 'error',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'waiting',\n 'canplay',\n 'canplaythrough',\n 'durationchange',\n 'volumechange',\n 'loadeddata',\n 'loadedmetadata',\n 'ratechange',\n 'progress',\n 'loadstart',\n 'emptied',\n 'stalled',\n 'suspend',\n 'abort',\n 'lowdecode'\n]\n\nexport const STATS_EVENTS = {\n STATS_INFO: 'stats_info',\n STATS_DOWNLOAD: 'stats_download',\n STATS_RESET: 'stats_reset'\n}\n\nexport const FPS_STUCK = 'fps_stuck'","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","import { EventEmitter } from 'eventemitter3'\n\n/**\n * @typedef { (Player) => ?boolean } IterateFunction\n */\n/**\n * @typedef { import('./player').default } Player\n */\n\n/**\n * global player instance memory\n * @type {{\n * [key:string]:\n * }}\n */\nconst store = {}\n\nlet instance = null\n/**\n * Design as a class so that can be inherited to enhance functionality\n */\nexport class InstManager extends EventEmitter {\n static getInstance () {\n instance ||= new InstManager()\n return instance\n }\n\n add (player) {\n if (!player) {\n return\n }\n store[player.playerId] = player\n\n // By default, the first one is active\n if (Object.keys(store).length === 1) {\n this.setActive(player.playerId, true)\n }\n }\n\n remove (player) {\n if (!player) {\n return\n }\n const isUserActive = player.isUserActive\n\n delete store[player.playerId]\n\n if (isUserActive) {\n // 暂时注释,有需求再打开\n // const keys = Object.keys(this.store)\n // if (keys.length > 0) {\n // this.setActive(keys[keys.length - 1], true)\n // }\n }\n }\n\n /**\n * @private\n * @param {IterateFunction} fn\n * @param {?boolean} endEarly\n */\n _iterate (fn, endEarly = false) {\n for (const key in store) {\n if (Object.prototype.hasOwnProperty.call(store, key)) {\n const player = store[key]\n\n if (endEarly) {\n if (fn(player)) {\n break\n }\n } else {\n fn(player)\n }\n }\n }\n }\n\n /**\n * @param {IterateFunction} fn\n */\n forEach (fn) {\n this._iterate(fn)\n }\n\n /**\n * Iterates over items of store, returning the first one\n * @param {IterateFunction} fn\n * @returns {Player}\n */\n find (fn) {\n let result = null\n\n this._iterate((player) => {\n const flag = fn(player)\n if (flag) {\n result = player\n }\n return flag\n }, true)\n\n return result\n }\n\n /**\n * @param {IterateFunction} fn\n * @returns {Player[]}\n */\n findAll (fn) {\n const results = []\n\n this._iterate((player) => {\n if (fn(player)) {\n results.push(player)\n }\n })\n\n return results\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @returns { number | null }\n */\n setActive (playerId, isActive = true) {\n if (!store[playerId]) {\n return\n }\n if (isActive) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = true\n inst.isInstNext = false\n } else {\n inst.isUserActive = false\n }\n })\n } else {\n store[playerId].isUserActive = isActive\n }\n return playerId\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | null }\n */\n getActiveId () {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const c = store[keys[i]]\n if (c && c.isUserActive) {\n return keys[i]\n }\n }\n return null\n }\n\n /**\n * 标记下一个实例\n * @param { number | string } playerId\n * @param { boolean } isNext\n * @returns { number | null }\n */\n setNext (playerId, isNext = true) {\n if (!store[playerId]) {\n return\n }\n if (isNext) {\n this.forEach(inst => {\n if (playerId === inst.playerId) {\n inst.isUserActive = false\n inst.isInstNext = true\n } else {\n inst.isInstNext = false\n }\n })\n } else {\n store[playerId].isInstNext = isNext\n }\n\n return playerId\n }\n}\n\n/**\n* Check whether there is a player instance in the current dom\n* @param {Element} root\n*/\nexport function checkPlayerRoot (root) {\n const keys = Object.keys(store)\n for (let i = 0; i < keys.length; i++) {\n const p = store[keys[i]]\n if (p.root === root) {\n return p\n }\n }\n return null\n}\n","export default {\n LANG: 'en',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: 'video download error'\n },\n mse: {\n code: 2,\n msg: 'stream append error'\n },\n parse: {\n code: 3,\n msg: 'parsing error'\n },\n format: {\n code: 4,\n msg: 'wrong format'\n },\n decoder: {\n code: 5,\n msg: 'decoding error'\n },\n runtime: {\n code: 6,\n msg: 'grammatical errors'\n },\n timeout: {\n code: 7,\n msg: 'play timeout'\n },\n other: {\n code: 8,\n msg: 'other errors'\n }\n },\n HAVE_NOTHING: 'There is no information on whether audio/video is ready',\n HAVE_METADATA: 'Audio/video metadata is ready ',\n HAVE_CURRENT_DATA: 'Data about the current play location is available, but there is not enough data to play the next frame/millisecond',\n HAVE_FUTURE_DATA: 'Current and at least one frame of data is available',\n HAVE_ENOUGH_DATA: 'The available data is sufficient to start playing',\n NETWORK_EMPTY: 'Audio/video has not been initialized',\n NETWORK_IDLE: 'Audio/video is active and has been selected for resources, but no network is used',\n NETWORK_LOADING: 'The browser is downloading the data',\n NETWORK_NO_SOURCE: 'No audio/video source was found',\n MEDIA_ERR_ABORTED: 'The fetch process is aborted by the user',\n MEDIA_ERR_NETWORK: 'An error occurred while downloading',\n MEDIA_ERR_DECODE: 'An error occurred while decoding',\n MEDIA_ERR_SRC_NOT_SUPPORTED: 'Audio/video is not supported',\n REPLAY: 'Replay',\n ERROR: 'Network is offline',\n PLAY_TIPS: 'Play',\n PAUSE_TIPS: 'Pause',\n PLAYNEXT_TIPS: 'Play next',\n DOWNLOAD_TIPS: 'Download',\n ROTATE_TIPS: 'Rotate',\n RELOAD_TIPS: 'Reload',\n FULLSCREEN_TIPS: 'Fullscreen',\n EXITFULLSCREEN_TIPS: 'Exit fullscreen',\n CSSFULLSCREEN_TIPS: 'Cssfullscreen',\n EXITCSSFULLSCREEN_TIPS: 'Exit cssfullscreen',\n TEXTTRACK: 'Caption',\n TEXTTRACK_OFF: 'Off',\n PIP: 'PIP',\n SCREENSHOT: 'Screenshot',\n LIVE: 'LIVE',\n OFF: 'Off',\n OPEN: 'Open',\n MINI_DRAG: 'Click and hold to drag',\n MINISCREEN: 'Miniscreen',\n REFRESH_TIPS: 'Please Try',\n REFRESH: 'Refresh',\n FORWARD: 'forward',\n LIVE_TIP: 'Live'\n }\n}\n","import Util from '../utils/util'\nimport EN from './en'\n/**\n * @typedef { {\n * LANG: string,\n * TEXT: {\n * [propName: string]: any\n * }\n * } } IXGI18nText\n */\n\n/**\n * @typedef { {\n * lang: { [propName: string]: IXGI18nText },\n * langKeys: Array<string>, // list of all currently supported languages\n * textKeys: { [propName: string]: string } // list of all currently supported texts\n * } } IXGI18n\n */\n\nconst XGI18nLang = {\n lang: {},\n langKeys: [],\n textKeys: []\n}\n\nfunction deepMerge (dst, src) {\n Object.keys(src).forEach(key => {\n const _s = Util.typeOf(src[key])\n const _t = Util.typeOf(dst[key])\n if (_s === 'Array') {\n if (_t !== 'Array') {\n dst[key] = []\n }\n dst[key].push(...src[key])\n } else if (_s === 'Object') {\n if (_t !== 'Object') {\n dst[key] = {}\n }\n deepMerge(dst[key], src[key])\n } else {\n dst[key] = src[key]\n }\n })\n return dst\n}\n\nfunction updateKeys () {\n Object.keys(XGI18nLang.lang.en).map(key => {\n XGI18nLang.textKeys[key] = key // key.toLowerCase()\n })\n}\n\n/**\n * @param { Array<IXGI18nText> } i18nTextList\n * @param { IXGI18n } [i18nLangs]\n */\nfunction extend (i18nTextList, i18nLangs) {\n let ext = []\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n if (Util.typeOf(i18nTextList) !== 'Array') {\n ext = Object.keys(i18nTextList).map(lang => {\n const keyLang = lang === 'zh' ? 'zh-cn' : lang\n return {\n LANG: keyLang,\n TEXT: i18nTextList[lang]\n }\n })\n } else {\n ext = i18nTextList\n }\n const { lang } = i18nLangs\n ext.map(item => {\n if (item.LANG === 'zh') {\n item.LANG = 'zh-cn'\n }\n if (!lang[item.LANG]) {\n use(item, i18nLangs)\n } else {\n deepMerge(lang[item.LANG] || {}, item.TEXT || {})\n }\n })\n updateKeys()\n}\n\n/**\n * @param { IXGI18nText } langData\n * @param { IXGI18n } [i18nLangs]\n */\nfunction use (langData, i18nLangs) {\n let _clang = langData.LANG\n if (!i18nLangs) {\n i18nLangs = XGI18nLang\n }\n if (!i18nLangs.lang) {\n return\n }\n const texts = langData.TEXT || {}\n if (_clang === 'zh') {\n _clang = 'zh-cn'\n }\n if (!i18nLangs.lang[_clang]) {\n i18nLangs.langKeys.push(_clang)\n i18nLangs.lang[_clang] = texts\n } else {\n deepMerge(i18nLangs.lang[_clang], texts)\n }\n updateKeys()\n}\n\n/**\n *\n * @returns { IXGI18n }\n */\nfunction init (id) {\n const ret = {\n lang: {},\n langKeys: [],\n textKeys: {},\n pId: id\n }\n deepMerge(ret.lang, XGI18nLang.lang)\n ret.langKeys.push(...XGI18nLang.langKeys)\n deepMerge(ret.textKeys, XGI18nLang.textKeys)\n return ret\n}\n\nuse(EN)\n\nconst I18N = {\n get textKeys () {\n return XGI18nLang.textKeys\n },\n /**\n * @description List of languages currently supported\n * @type { Array<string> }\n */\n get langKeys () {\n return XGI18nLang.langKeys\n },\n /**\n * @type {{\n * [propName: string]: {\n * [propName: string]: string\n * }\n * }}\n */\n get lang () {\n const ret = {}\n XGI18nLang.langKeys.map(key => {\n ret[key] = XGI18nLang.lang[key]\n })\n if (XGI18nLang.lang['zh-cn']) {\n ret.zh = XGI18nLang.lang['zh-cn'] || {}\n }\n return ret\n },\n\n /**\n * @desc Extend existing languages text\n * @type {(I18nText: IXGI18nText) => {}}\n */\n extend: extend,\n\n /**\n * Add new language text\n * @type {(lang: IXGI18nText) => {}}\n */\n use: use,\n\n /**\n * Initialize a language text\n * @return { IXGI18n }\n */\n init: init\n}\n\nexport default I18N\n","/**\n * @typedef {{\n * isSupport: boolean,\n * mime: string\n * }} ICheckResult\n */\n\n/**\n * @typedef {{\n * device: 'pc' | 'mobile',\n * browser: 'ie' | 'firefox' | 'chrome' | 'opera' | 'safari',\n * os: {\n * isTablet: boolean,\n * isPhone: boolean,\n * isIpad: boolean,\n * isIos: boolean,\n * isAndroid: boolean,\n * isPc: boolean,\n * isSymbian: boolean,\n * isWindowsPhone: boolean,\n * isFireFox: boolean,\n * isHarmonyOS: boolean\n * },\n * isWeixin: boolean,\n * isSupportMP4(): ICheckResult,\n * isHevcSupported(): boolean,\n * probeConfigSupported(info: MediaDecodingConfiguration): Promise<MediaCapabilitiesDecodingInfo>\n * }} ISniffer\n */\n\nconst VERSION_REG = {\n android: /(Android)\\s([\\d.]+)/,\n harmony: /(OpenHarmony|HarmonyOS)\\s([\\d.]+)/,\n ios: /(Version)\\/([\\d.]+)/\n}\n\nconst H264_MIMETYPES = [\n 'avc1.42E01E, mp4a.40.2',\n 'avc1.58A01E, mp4a.40.2',\n 'avc1.4D401E, mp4a.40.2',\n 'avc1.64001E, mp4a.40.2',\n 'avc1.42E01E',\n 'mp4v.20.8',\n 'mp4v.20.8, mp4a.40.2',\n 'mp4v.20.240, mp4a.40.2'\n]\n\n/**\n * @type ISniffer\n */\nconst sniffer = {\n get device () {\n const r = sniffer.os\n return r.isPc ? 'pc' : 'mobile'\n // return r.isPc ? 'pc' : r.isTablet ? 'tablet' : 'mobile'\n },\n get browser () {\n if (typeof navigator === 'undefined') {\n return ''\n }\n const ua = navigator.userAgent.toLowerCase()\n const reg = {\n ie: /rv:([\\d.]+)\\) like gecko/,\n firefox: /firefox\\/([\\d.]+)/,\n chrome: /chrome\\/([\\d.]+)/,\n opera: /opera.([\\d.]+)/,\n safari: /version\\/([\\d.]+).*safari/\n }\n return [].concat(Object.keys(reg).filter(key => reg[key].test(ua)))[0] || ''\n },\n get os () {\n if (typeof navigator === 'undefined') {\n return {}\n }\n const ua = navigator.userAgent\n const isWindowsPhone = /(?:Windows Phone)/.test(ua)\n const isSymbian = /(?:SymbianOS)/.test(ua) || isWindowsPhone\n const isTizen = /(?:Tizen)/ig.test(ua) // Samsung Tizen TV\n const isWebOS = /(?:Web0S)/ig.test(ua) // LG TV\n const isHarmonyOS = /(?:OpenHarmony|HarmonyOS)/i.test(ua)\n const isAndroid = /(?:Android)/.test(ua)\n const isFireFox = /(?:Firefox)/.test(ua)\n const isIpad = /(?:iPad|PlayBook)/.test(ua) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n const isTablet =\n isIpad ||\n (isAndroid && !/(?:Mobile)/.test(ua)) ||\n ((isHarmonyOS || isFireFox) && /(?:Tablet)/.test(ua))\n const isPhone = /(?:Phone)/.test(ua) /* iPhone or HarmonyOS Phone */ && !isTablet\n const isPc = !isPhone && !isAndroid && !isSymbian && !isTablet\n return {\n isTablet,\n isPhone,\n isIpad,\n isIos: isPhone || isIpad,\n isAndroid,\n isPc,\n isSymbian,\n isWindowsPhone,\n isFireFox,\n isHarmonyOS,\n isTizen,\n isWebOS\n }\n },\n\n get osVersion () {\n if (typeof navigator === 'undefined') {\n return 0\n }\n const ua = navigator.userAgent\n let reg = ''\n if (/(?:iPhone)|(?:iPad|PlayBook)/.test(ua)) {\n // ios\n reg = VERSION_REG.ios\n } else if (/(?:OpenHarmony|HarmonyOS)/i.test(ua)) {\n // harmony os\n reg = VERSION_REG.harmony\n } else {\n // android\n reg = VERSION_REG.android\n }\n const _match = reg ? reg.exec(ua) : []\n if (_match && _match.length >= 3) {\n const version = _match[2].split('.')\n return version.length > 0 ? parseInt(version[0]) : 0\n }\n return 0\n },\n\n get isWeixin () {\n if (typeof navigator === 'undefined') {\n return false\n }\n const reg = /(micromessenger)\\/([\\d.]+)/\n const match = reg.exec(navigator.userAgent.toLocaleLowerCase())\n if (match) {\n return true\n }\n return false\n },\n\n /**\n *\n * @returns {{\n * isSupport: boolean,\n * mime: string\n * }}\n */\n isSupportMP4 () {\n const result = {\n isSupport: false,\n mime: ''\n }\n if (typeof document === 'undefined') {\n return result\n }\n if (this.supportResult) {\n return this.supportResult\n }\n let a = document.createElement('video')\n if (typeof a.canPlayType === 'function') {\n H264_MIMETYPES.map((key) => {\n if (a.canPlayType(`video/mp4; codecs=\"${key}\"`) === 'probably') {\n result.isSupport = true\n result.mime += `||${key}`\n }\n })\n }\n this.supportResult = result\n a = null\n return result\n },\n\n /**\n * @description check is support MediaSource Extends\n * @param {string} [mime]\n * @returns { boolean }\n */\n isMSESupport (mime = 'video/mp4; codecs=\"avc1.42E01E,mp4a.40.2\"') {\n if (typeof MediaSource === 'undefined' || !MediaSource) return false\n try {\n return MediaSource.isTypeSupported(mime)\n } catch (error) {\n this._logger.error(mime, error)\n return false\n }\n },\n\n /**\n * Is HEVC Hardware decoding supported by current browser\n * @returns {boolean}\n */\n isHevcSupported () {\n if (typeof MediaSource === 'undefined' || !MediaSource.isTypeSupported) {\n return false\n }\n return (\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.1.6.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.2.4.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.3.E.L120.90\"') ||\n MediaSource.isTypeSupported('video/mp4;codecs=\"hev1.4.10.L120.90\"')\n )\n },\n\n /**\n * @param { MediaDecodingConfiguration } info\n * @returns { Promise<MediaCapabilitiesDecodingInfo> }\n */\n probeConfigSupported (info) {\n const defaults = {\n supported: false,\n smooth: false,\n powerEfficient: false\n }\n if (!info || typeof navigator === 'undefined') {\n return Promise.resolve(defaults)\n }\n if (\n navigator.mediaCapabilities &&\n navigator.mediaCapabilities.decodingInfo\n ) {\n return navigator.mediaCapabilities.decodingInfo(info)\n } else {\n const videoConfig = info.video || {}\n const audioConfig = info.audio || {}\n try {\n const videoSupported = MediaSource.isTypeSupported(\n videoConfig.contentType\n )\n const audioSupported = MediaSource.isTypeSupported(\n audioConfig.contentType\n )\n\n return Promise.resolve({\n supported: videoSupported && audioSupported,\n smooth: false,\n powerEfficient: false\n })\n } catch (e) {\n return Promise.resolve(defaults)\n }\n }\n }\n}\n\nexport default sniffer\n","import EventEmitter from 'eventemitter3'\nimport Util from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Errors, { ERROR_TYPE_MAP } from './error'\nimport { URL_CHANGE, WAITING, VIDEO_EVENTS, SOURCE_ERROR, SOURCE_SUCCESS } from './events'\n/**\n * @typedef { import ('eventemitter3') } EventEmitter\n */\n/**\n * @typedef { {\n * duration: number,\n * currentTime: number,\n * muted: boolean,\n * defaultMuted: boolean,\n * volume: number,\n * playbackRate: number,\n * defaultPlaybackRate: number,\n * autoplay: boolean,\n * readonly paused: boolean,\n * readonly ended: boolean,\n * readonly networkState: number,\n * readonly readyState: number,\n * readonly seeking: boolean,\n * src: any,\n * play: Function,\n * pause: Function,\n * } } IMediaProxy\n */\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\nfunction emitVideoEvent (eventKey, e) {\n if (!this || !this.emit) {\n return\n }\n if (eventKey === 'error') {\n this.errorHandler(eventKey, e.error)\n } else {\n this.emit(eventKey, e)\n }\n}\n\n// 获取包装EventsMiddleware后的VIDEO_EVENT\nfunction getVideoEventHandler (eventKey, player) {\n return (e, _err) => {\n const eData = {\n player,\n eventName: eventKey,\n originalEvent: e,\n detail: e.detail || {},\n timeStamp: e.timeStamp,\n currentTime: player.currentTime,\n duration: player.duration,\n paused: player.paused,\n ended: player.ended,\n isInternalOp: !!player._internalOp[e.type], // 是否是内部操作,不反应到UI上\n muted: player.muted,\n volume: player.volume,\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype\n }\n player.removeInnerOP(e.type)\n if (eventKey === 'timeupdate') {\n player._currentTime = player.media && player.media.currentTime\n }\n\n // 避免playbackRate和defaultPlaybackRate同时设置导致多次触发事件\n if (eventKey === 'ratechange') {\n const _rate = player.media ? player.media.playbackRate : 0\n if (_rate && player._rate === _rate) {\n return\n }\n player._rate = player.media && player.media.playbackRate\n }\n\n if (eventKey === 'durationchange') {\n player._duration = player.media.duration\n }\n\n if (eventKey === 'volumechange') {\n eData.isMutedChange = player._lastMuted !== player.muted\n player._lastMuted = player.muted\n }\n\n if (eventKey === 'error') {\n eData.error = _err || player.video.error\n }\n\n // 执行video相关事件中间件能力\n if (player.mediaEventMiddleware[eventKey]) {\n const callback = emitVideoEvent.bind(player, eventKey, eData)\n try {\n player.mediaEventMiddleware[eventKey].call(player, eData, callback)\n } catch (err) {\n emitVideoEvent.call(player, eventKey, eData)\n throw err\n }\n } else {\n emitVideoEvent.call(player, eventKey, eData)\n }\n }\n}\n\n/**\n * @extends { EventEmitter }\n */\nclass MediaProxy extends EventEmitter {\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n super(options)\n /**\n * @type { boolean }\n * @private\n */\n this._hasStart = false\n /**\n * @type { number }\n * @private\n */\n this._currentTime = 0\n /**\n * @type { number }\n * @private\n */\n this._duration = 0\n /**\n * @type {{[propName: string]: any}}\n * @private\n */\n this._internalOp = {}\n /**\n * @type { boolean }\n * @private\n */\n this._lastMuted = false\n\n /**\n * @type {string}\n * 当前播放类型\n */\n this.vtype = 'MP4'\n\n /**\n * @type {number}\n * @private\n */\n this._rate = -1\n /**\n * @description 初始化时添加在video上的属性集合\n * @type { {[propName: string]: any } }\n */\n this.mediaConfig = Object.assign({}, {\n controls: false,\n autoplay: options.autoplay,\n playsinline: options.playsinline,\n 'x5-playsinline': options.playsinline,\n 'webkit-playsinline': options.playsinline,\n 'x5-video-player-fullscreen': options['x5-video-player-fullscreen'] || options.x5VideoPlayerFullscreen,\n 'x5-video-orientation': options['x5-video-orientation'] || options.x5VideoOrientation,\n airplay: options.airplay,\n 'webkit-airplay': options.airplay,\n tabindex: options.tabindex | 0,\n mediaType: options.mediaType || 'video',\n 'data-index': -1\n }, options.videoConfig, options.videoAttributes)\n /**\n * @description Compatible with WeChat webview\n * \"x5-playsinline' and 'x5-video-player-type' only one needs to exist\n * @doc https://x5.tencent.com/docs/video.html\n */\n const playerType = options['x5-video-player-type'] || options.x5VideoPlayerType\n if (Sniffer.isWeixin && Sniffer.os.isAndroid && playerType) {\n this.mediaConfig['x5-video-player-type'] = playerType\n delete this.mediaConfig.playsinline\n delete this.mediaConfig['webkit-playsinline']\n delete this.mediaConfig['x5-playsinline']\n }\n\n if (options.loop) {\n this.mediaConfig.loop = 'loop'\n }\n\n // Warning:一些移动端浏览器需要设置DOM属性,否则会导致非静音切换频地址后开播失败\n if (options.autoplayMuted && !Object.prototype.hasOwnProperty.call(this.mediaConfig, 'muted')) {\n this.mediaConfig.muted = true\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n */\n this.media =\n options.mediaEl instanceof HTMLMediaElement\n ? options.mediaEl\n : typeof options.mediaEl === 'function'\n ? options.mediaEl(this.mediaConfig)\n : Util.createDom(this.mediaConfig.mediaType, '', this.mediaConfig, '')\n\n if (options.defaultPlaybackRate) {\n this.media.defaultPlaybackRate = this.media.playbackRate = options.defaultPlaybackRate\n }\n\n if (Util.typeOf(options.volume) === 'Number') {\n this.volume = options.volume\n }\n\n if (options.autoplayMuted) {\n this.media.muted = true\n this._lastMuted = true\n }\n if (options.autoplay) {\n this.media.autoplay = true\n }\n\n // Warning:一些移动端浏览器(Like Vivo)需要直接设置JS属性,否则会导致失效\n if (options.playsinline) {\n this.media.playsinline = true\n }\n\n /**\n * @private\n */\n this._interval = {}\n /**\n * @readonly\n */\n this.mediaEventMiddleware = {}\n this.attachVideoEvents()\n }\n\n /**\n * @description set middleware\n * @param { {[propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n setEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n this.mediaEventMiddleware[key] = middlewares[key]\n })\n }\n\n /**\n * @description remove middleware\n * @param { { [propName: string]: (e: {player: any, eventName: string}, callback: () => void) => any} } middlewares\n */\n removeEventsMiddleware (middlewares) {\n Object.keys(middlewares).map(key => {\n delete this.mediaEventMiddleware[key]\n })\n }\n\n /**\n * Add media eventListener to the video object\n * @param { any } [media]\n */\n attachVideoEvents (media = this.media) {\n if (!this._evHandlers) {\n /**\n * @private\n */\n this._evHandlers = VIDEO_EVENTS.map(eventKey => {\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.on(eventKey, this[funName])\n }\n\n return {\n [eventKey]: getVideoEventHandler(eventKey, this)\n }\n })\n }\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.addEventListener(eventKey, item[eventKey], false)\n })\n }\n\n /**\n * @description remove media eventListener from the video object\n * @param { any } [media]\n */\n detachVideoEvents (media = this.media) {\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n media.removeEventListener(eventKey, item[eventKey], false)\n })\n\n this._evHandlers.forEach(item => {\n const eventKey = Object.keys(item)[0]\n const funName = `on${eventKey.charAt(0).toUpperCase()}${eventKey.slice(1)}`\n if (typeof this[funName] === 'function') {\n this.off(eventKey, this[funName])\n }\n })\n\n this._evHandlers = null\n }\n\n /**\n * 针对source列表播放方式添加错误监听\n * @doc https://stackoverflow.com/questions/47557135/html5-detect-the-type-of-error-when-trying-to-load-a-video-using-a-source-elem\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n * @param { Array<{src: string, type: string }>} urls\n */\n _attachSourceEvents (video, urls) {\n video.removeAttribute('src')\n video.load()\n urls.forEach((item, index) => {\n this.media.appendChild(Util.createDom('source', '', {\n src: `${item.src}`,\n type: `${item.type || ''}`,\n 'data-index': index + 1\n }))\n })\n const _c = video.children\n if (!_c) {\n return\n }\n /**\n * @private\n */\n this._videoSourceCount = _c.length\n\n this._videoSourceIndex = _c.length\n\n this._vLoadeddata = (e) => {\n this.emit(SOURCE_SUCCESS, { src: e.target.currentSrc, host: Util.getHostFromUrl(e.target.currentSrc) })\n }\n\n /**\n * @private\n */\n let _eHandler = null\n\n for (let i = 0; i < this._evHandlers.length; i++) {\n if (Object.keys(this._evHandlers[i])[0] === 'error') {\n _eHandler = this._evHandlers[i]\n break\n }\n }\n // safari有些版本不是所有source都请求,导致单独使用_videoSourceIndex计算会报错\n !this._sourceError && (this._sourceError = (e) => {\n const _dIndex = parseInt(e.target.getAttribute('data-index'), 10)\n this._videoSourceIndex--\n if (this._videoSourceIndex === 0 || _dIndex >= this._videoSourceCount) {\n const _err = { code: 4, message: 'sources_load_error' }\n _eHandler ? _eHandler.error(e, _err) : this.errorHandler('error', _err)\n }\n const type = ERROR_TYPE_MAP[4]\n this.emit(SOURCE_ERROR, new Errors(this, {\n errorType: type,\n errorCode: 4,\n errorMessage: 'sources_load_error',\n mediaError: { code: 4, message: 'sources_load_error' },\n src: e.target.src\n }))\n })\n for (let i = 0; i < _c.length; i++) {\n _c[i].addEventListener('error', this._sourceError)\n }\n video.addEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * 移除source列表错误事件监听\n * @protected\n * @param { HTMLVideoElement | HTMLAudioElement } video\n */\n _detachSourceEvents (video) {\n const _c = video.children\n if (!_c || _c.length === 0 || !this._sourceError) {\n return\n }\n for (let i = 0; i < _c.length; i++) {\n _c[i].removeEventListener('error', this._sourceError)\n }\n while (_c.length > 0) {\n video.removeChild(_c[0])\n }\n this._vLoadeddata && video.removeEventListener('loadeddata', this._vLoadeddata)\n }\n\n /**\n * @description Media Error handler\n * @param { string } eventName\n */\n errorHandler (name, error = null) {\n if (this.media && (this.media.error || error)) {\n let _e = this.media.error || error\n const type = _e.code ? ERROR_TYPE_MAP[_e.code] : 'other'\n let message = _e.message\n if (!(this.media.currentSrc || this.media.srcObject)) {\n message = 'empty_src'\n _e = {\n code: 6,\n message\n }\n }\n this.emit(name, new Errors(this, {\n errorType: type,\n errorCode: _e.code,\n errorMessage: _e.message || '',\n mediaError: _e\n }))\n }\n }\n\n destroy () {\n if (this.media) {\n if (this.media.pause) {\n this.media.pause()\n this.media.muted = true\n }\n this.media.removeAttribute('src') // empty source\n this.media.load()\n }\n this._currentTime = 0\n this._duration = 0\n this.mediaConfig = null\n for (const k in this._interval) {\n if (Object.prototype.hasOwnProperty.call(this._interval, k)) {\n clearInterval(this._interval[k])\n this._interval[k] = null\n }\n }\n this.detachVideoEvents()\n this.media = null\n this.mediaEventMiddleware = {}\n this.removeAllListeners()\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media\n */\n get video () {\n return this.media\n }\n\n /**\n * @type { HTMLVideoElement | HTMLAudioElement | HTMLElement | IMediaProxy | null }\n * @deprecated Property [video] is renamed to [media],you can access using player.media= xx\n */\n set video (media) {\n this.media = media\n }\n\n /**\n *\n * @returns { Promise<void> | null }\n */\n play () {\n const ret = this.media ? this.media.play() : null\n return ret\n }\n\n pause () {\n this.media && this.media.pause()\n }\n\n load () {\n this.media && this.media.load()\n }\n\n /**\n *\n * @param { string } type\n * @returns { boolean }\n */\n canPlayType (type) {\n return this.media ? this.media.canPlayType(type) : false\n }\n\n /**\n *\n * @param { any } [buffered]\n * @returns { Array<number> }\n */\n getBufferedRange (buffered) {\n const range = [0, 0]\n if (!this.media) {\n return range\n }\n if (!buffered) {\n buffered = this.media.buffered\n }\n const currentTime = this.media.currentTime\n if (buffered) {\n for (let i = 0, len = buffered.length; i < len; i++) {\n range[0] = buffered.start(i)\n range[1] = buffered.end(i)\n if (range[0] <= currentTime && currentTime <= range[1]) {\n break\n }\n }\n }\n if (range[0] - currentTime <= 0 && currentTime - range[1] <= 0) {\n return range\n } else {\n return [0, 0]\n }\n }\n\n /**\n * @type { boolean }\n * @description 设置/返回 自动播放属性\n */\n set autoplay (isTrue) {\n this.media && (this.media.autoplay = isTrue)\n }\n\n get autoplay () {\n return this.media ? this.media.autoplay : false\n }\n\n /**\n * @type { TimeRanges | null }\n * @description 返回当前缓冲的TimeRange对象集合\n */\n get buffered () {\n return this.media ? this.media.buffered : null\n }\n\n /**\n * @type { Array<{start: number, end: number}> | null}\n * @description 返回当前自定义的缓存列表\n */\n get buffered2 () {\n return this.media && this.media.buffered ? Util.getBuffered2(this.media.buffered) : null\n }\n\n /**\n * @type { {start: number, end: number} }\n */\n get bufferedPoint () {\n const ret = {\n start: 0,\n end: 0\n }\n if (!this.media) {\n return ret\n }\n const _buffered = this.media.buffered\n if (!_buffered || _buffered.length === 0) {\n return ret\n }\n for (let i = 0; i < _buffered.length; i++) {\n if ((_buffered.start(i) <= this.currentTime || _buffered.start(i) < 0.1) && _buffered.end(i) >= this.currentTime) {\n return {\n start: _buffered.start(i),\n end: _buffered.end(i)\n }\n }\n }\n return ret\n }\n\n /**\n * @type { string}\n * @description 设置/返回是否跨域\n * */\n get crossOrigin () {\n return this.media ? this.media.crossOrigin : ''\n }\n\n set crossOrigin (isTrue) {\n this.media && (this.media.crossOrigin = isTrue)\n }\n\n /**\n * @type { string }\n * @description 设置/返回视频播放地址\n * */\n get currentSrc () {\n return this.media ? this.media.currentSrc : ''\n }\n\n set currentSrc (src) {\n this.media && (this.media.currentSrc = src)\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频当前播放时间\n * */\n get currentTime () {\n if (!this.media) {\n return 0\n }\n return this.media.currentTime !== undefined ? this.media.currentTime : this._currentTime\n }\n\n set currentTime (time) {\n this.media && (this.media.currentTime = time)\n }\n\n /**\n * @type { boolean }\n * 设置/返回视频默认静音\n * */\n get defaultMuted () {\n return this.media ? this.media.defaultMuted : false\n }\n\n set defaultMuted (isTrue) {\n this.media && (this.media.defaultMuted = isTrue)\n }\n\n /**\n * @type { number }\n * @description 返回视频时长,单位:s\n * */\n get duration () {\n return this._duration\n }\n\n /**\n * @type { boolean }\n * @description 回视频是否播放结束\n * */\n get ended () {\n return this.media ? this.media.ended : false\n }\n\n /**\n * @type { MediaError }\n * @description the player current error\n */\n get error () {\n return this.media.error\n }\n\n /**\n * @type { string }\n * @description return error description text\n */\n get errorNote () {\n const err = this.media.error\n if (!err) {\n return ''\n }\n const status = [\n 'MEDIA_ERR_ABORTED',\n 'MEDIA_ERR_NETWORK',\n 'MEDIA_ERR_DECODE',\n 'MEDIA_ERR_SRC_NOT_SUPPORTED'\n ]\n return status[this.media.error.code - 1]\n }\n\n /**\n * @type { boolean }\n * @description 否开启了循环播放\n */\n get loop () {\n return this.media ? this.media.loop : false\n }\n\n set loop (isTrue) {\n this.media && (this.media.loop = isTrue)\n }\n\n /**\n * @type { boolean }\n * @description 静音\n */\n get muted () {\n return this.media ? this.media.muted : false\n }\n\n set muted (isTrue) {\n if (!this.media || this.media.muted === isTrue) {\n return\n }\n this._lastMuted = this.media.muted\n this.media.muted = isTrue\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 }\n * @description 返回视频的当前网络状态\n */\n get networkState () {\n return this.media.networkState\n }\n\n /**\n * @type { boolean }\n * @description 回当前视频是否是暂停状态\n */\n get paused () {\n return this.media ? this.media.paused : true\n }\n\n /**\n * @type { number }\n * @description 返回/设置倍速\n */\n get playbackRate () {\n return this.media ? this.media.playbackRate : 0\n }\n\n set playbackRate (rate) {\n if (!this.media || rate === Infinity) {\n return\n }\n this.media.defaultPlaybackRate = rate\n this.media.playbackRate = rate\n }\n\n /**\n * @type { TimeRanges | null}\n */\n get played () {\n return this.media ? this.media.played : null\n }\n\n /**\n * @type { boolean }\n */\n get preload () {\n return this.media ? this.media.preload : false\n }\n\n set preload (isTrue) {\n this.media && (this.media.preload = isTrue)\n }\n\n /**\n * @type { 0 | 1 | 2 | 3 | 4 }\n * @description 回视频的就绪状态\n */\n get readyState () {\n return this.media.readyState\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否可以seek\n */\n get seekable () {\n return this.media ? this.media.seekable : false\n }\n\n /**\n * @type { boolean }\n * @description 当前视频是否处于seeking状态下\n */\n get seeking () {\n return this.media ? this.media.seeking : false\n }\n\n /**\n * @type { any }\n * @description 设置/返回当前视频的地址\n */\n get src () {\n return this.media ? this.media.src : ''\n }\n\n set src (url) {\n if (!this.media) {\n return\n }\n this.emit(URL_CHANGE, url)\n this.emit(WAITING)\n // this.media.pause()\n this._currentTime = 0\n this._duration = 0\n // Some firefox versions firefox Cannot recognize currentSrc of type Blob\n if (Util.isMSE(this.media)) {\n this.onWaiting()\n return\n }\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array') {\n this._attachSourceEvents(this.media, url)\n } else if (url) {\n this.media.src = url\n } else {\n this.media.removeAttribute('src')\n }\n this.load()\n }\n\n /**\n * @type { number }\n * @description 设置/返回视频的音量\n */\n get volume () {\n return this.media ? this.media.volume : 0\n }\n\n set volume (vol) {\n if (vol === Infinity || !this.media) {\n return\n }\n this.media.volume = vol\n }\n\n /**\n * @type { number }\n * @description 返回视频的纵横比\n */\n get aspectRatio () {\n return this.media ? this.media.videoWidth / this.media.videoHeight : 0\n }\n\n addInnerOP (event) {\n this._internalOp[event] = true\n }\n\n removeInnerOP (event) {\n delete this._internalOp[event]\n }\n /** ******************* 以下api只有申明作用,具体实现依赖EventEmitter ******************/\n\n /**\n * @param { string } event\n * @param { any } [data]\n * @returns\n */\n emit (event, data, ...args) {\n super.emit(event, data, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n on (event, callback, ...args) {\n super.on(event, callback, ...args)\n }\n\n /**\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n once (event, callback, ...args) {\n super.once(event, callback, ...args)\n }\n\n /**\n *\n * @param { string } event\n * @param { (...args: any[]) => any } callback\n * @returns\n */\n off (event, callback, ...args) {\n super.off(event, callback, ...args)\n }\n\n offAll () {\n super.removeAllListeners()\n }\n}\n\nexport default MediaProxy\n","class INDEXDB {\n constructor (mydb = { name: 'xgplayer', version: 1, db: null, ojstore: { name: 'xg-m4a', keypath: 'vid' } }) {\n this.indexedDB = window.indexedDB || window.webkitindexedDB\n this.IDBKeyRange = window.IDBKeyRange || window.webkitIDBKeyRange // 键范围\n this.myDB = mydb\n }\n\n openDB (callback) {\n // 建立或打开数据库,建立对象存储空间(ObjectStore)\n const self = this\n const version = this.myDB.version || 1\n const request = self.indexedDB.open(self.myDB.name, version)\n request.onerror = function (e) {\n // console.log('e.currentTarget.error.message')\n }\n request.onsuccess = e => {\n this.myDB.db = e.target.result\n // console.log('成功建立并打开数据库:' + this.myDB.name + ' version' + this.myDB.version)\n callback.call(self)\n }\n request.onupgradeneeded = e => {\n const db = e.target.result\n // eslint-disable-next-line no-unused-vars\n const transaction = e.target.transaction\n // eslint-disable-next-line no-unused-vars\n let store\n if (!db.objectStoreNames.contains(self.myDB.ojstore.name)) {\n // 没有该对象空间时创建该对象空间\n // eslint-disable-next-line no-unused-vars\n store = db.createObjectStore(self.myDB.ojstore.name, { keyPath: self.myDB.ojstore.keypath })\n // console.log('成功建立对象存储空间:' + this.myDB.ojstore.name)\n }\n }\n }\n\n deletedb () {\n // 删除数据库\n const self = this\n self.indexedDB.deleteDatabase(this.myDB.name)\n // console.log(this.myDB.name + '数据库已删除')\n }\n\n closeDB () {\n // 关闭数据库\n this.myDB.db.close()\n // console.log('数据库已关闭')\n }\n\n addData (storename, data) {\n // 添加数据,重复添加会报错\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.add(data[i])\n request.onerror = function () {\n // console.error('add添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('add添加数据已存入数据库')\n }\n }\n }\n\n putData (storename, data) {\n // 添加数据,重复添加会更新原有数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n let request\n for (let i = 0; i < data.length; i++) {\n request = store.put(data[i])\n request.onerror = function () {\n // console.error('put添加数据库中已有该数据')\n }\n request.onsuccess = function () {\n // console.log('put添加数据已存入数据库')\n }\n }\n }\n\n getDataByKey (storename, key, callback) {\n const self = this\n // 根据存储空间的键找到对应数据\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n const request = store.get(key)\n request.onerror = function () {\n // console.error('getDataByKey error')\n callback.call(self, null)\n }\n request.onsuccess = function (e) {\n const result = e.target.result\n // console.log('查找数据成功')\n callback.call(self, result)\n }\n }\n\n deleteData (storename, key) {\n // 删除某一条记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.delete(key)\n // console.log('已删除存储空间' + storename + '中' + key + '记录')\n }\n\n clearData (storename) {\n // 删除存储空间全部记录\n const store = this.myDB.db.transaction(storename, 'readwrite').objectStore(storename)\n store.clear()\n // console.log('已删除存储空间' + storename + '全部记录')\n }\n}\n\nexport default INDEXDB\n","export const FULLSCREEN_EVENTS = ['fullscreenchange', 'webkitfullscreenchange', 'mozfullscreenchange', 'MSFullscreenChange']\n\nexport const GET_FULLSCREEN_API = ['requestFullscreen', 'webkitRequestFullscreen', 'mozRequestFullScreen', 'msRequestFullscreen']\n\nexport const EXIT_FULLSCREEN_API = ['exitFullscreen', 'webkitExitFullscreen', 'mozCancelFullScreen', 'msExitFullscreen']\n\nexport const PLATER_ID = 'data-xgplayerid'","function callHandler (obj, handler, next, ...args) {\n const ret = handler.call(obj, ...args)\n if (!next || typeof next !== 'function') {\n return\n }\n if (ret && ret.then) {\n ret.then((...args) => {\n next.call(obj, ...args)\n })\n } else {\n next.call(obj, ...args)\n }\n}\n\n/**\n * 给某个处理函数添加hook能力\n * @param { string } hookName\n * @param { Function } handler\n * @param { { pre?: any, next?:any } } preset\n * {\n * pre: () => { // run beafore hook},\n * next: () => { // run after hook return}\n * }\n */\nfunction hook (hookName, handler, preset = { pre: null, next: null }) {\n if (!this.__hooks) {\n this.__hooks = {}\n }\n !this.__hooks[hookName] && (this.__hooks[hookName] = null)\n return function () {\n if (preset.pre) {\n try {\n preset.pre.call(this, ...arguments)\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}:pre error] >> ${e.message}`\n throw e\n }\n }\n if (this.__hooks && this.__hooks[hookName]) {\n try {\n const preRet = runHooks(this, hookName, handler, ...arguments)\n if (preRet) {\n if (preRet.then) {\n preRet.then((isContinue) => {\n if (isContinue !== false) {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n }).catch(e => {\n throw e\n })\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n // handler.call(this, ...arguments)\n }\n } else if (preRet === undefined) {\n callHandler(this, handler, preset.next, ...arguments)\n }\n } catch (e) {\n e.message = `[pluginName: ${this.pluginName}:${hookName}] >> ${e.message}`\n throw e\n }\n } else {\n callHandler(this, handler, preset.next, ...arguments)\n }\n }.bind(this)\n}\n\nfunction findHookIndex (hookName, handler) {\n const { __hooks } = this\n if (!__hooks || !Array.isArray(__hooks[hookName])) {\n return -1\n }\n const hookHandlers = __hooks[hookName]\n for (let i = 0; i < hookHandlers.length; i++) {\n if (hookHandlers[i] === handler) {\n return i\n }\n }\n return -1\n}\n\n/**\n * add hooks\n * @param { string } hookName\n * @param { Function } handler\n */\nfunction useHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n // eslint-disable-next-line no-prototype-builtins\n if (!__hooks.hasOwnProperty(hookName)) {\n console.warn(`has no supported hook which name [${hookName}]`)\n return false\n }\n if (!Array.isArray(__hooks[hookName])) {\n __hooks[hookName] = []\n }\n\n if (findHookIndex.call(this, hookName, handler) === -1) {\n __hooks[hookName].push(handler)\n }\n return true\n}\n\n/**\n * remove hook\n * @param { string } hookName\n * @param { (plugin: any, ..args) => {} } handler\n * @returns void\n */\nfunction removeHooks (hookName, handler) {\n const { __hooks } = this\n if (!__hooks) {\n return\n }\n\n if (Array.isArray(__hooks[hookName])) {\n const hooks = __hooks[hookName]\n const index = findHookIndex.call(this, hookName, handler)\n\n if (index !== -1) {\n hooks.splice(index, 1)\n }\n } else if (__hooks[hookName]) {\n __hooks[hookName] = null\n // delete __hooks[hookName]\n }\n}\n\n/**\n * Add hooks to a plugin\n * @param { string } pluginName\n * @param {...any} args\n */\nfunction usePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n return plugin.useHooks && plugin.useHooks(...args)\n}\n\nfunction removePluginHooks (pluginName, ...args) {\n if (!this.plugins || !this.plugins[pluginName.toLowerCase()]) {\n return\n }\n const plugin = this.plugins[pluginName.toLowerCase()]\n if (plugin) {\n return plugin.removeHooks && plugin.removeHooks(...args)\n }\n}\n\n/**\n * hook decorator, add hooks props for for an instance\n * @param { any } instance\n * @param { Array<string> } [hookNames]\n */\nfunction hooksDescriptor (instance, presetHooks = []) {\n instance.__hooks = {}\n presetHooks && presetHooks.map(item => {\n instance.__hooks[item] = null\n })\n Object.defineProperty(instance, 'hooks', {\n get: () => {\n return instance.__hooks && Object.keys(instance.__hooks).map(key => {\n if (instance.__hooks[key]) {\n return key\n }\n })\n }\n })\n}\n\nfunction delHooksDescriptor (instance) {\n instance.__hooks = null\n}\n\nfunction runHooks (obj, hookName, handler, ...args) {\n if (obj.__hooks && Array.isArray(obj.__hooks[hookName])) {\n const hooks = obj.__hooks[hookName]\n let index = -1\n /**\n * @private\n */\n const runHooksRecursive = function (obj, hookName, handler, ...args) {\n index++\n // 递归终止条件\n if (hooks.length === 0 || index === hooks.length) {\n return handler.call(obj, obj, ...args)\n }\n // 递归调用\n const hook = hooks[index]\n const ret = hook.call(obj, obj, ...args)\n if (ret && ret.then) {\n return ret.then((data) => {\n return data === false ? null : runHooksRecursive(obj, hookName, handler, ...args)\n }).catch(e => {\n console.warn(`[runHooks]${hookName} reject`, e.message)\n })\n } else if (ret !== false) {\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else if (ret === false) {\n return false\n }\n }\n\n return runHooksRecursive(obj, hookName, handler, ...args)\n } else {\n return handler.call(obj, obj, ...args)\n }\n}\n\nexport {\n hooksDescriptor as default,\n hook,\n useHooks,\n usePluginHooks,\n removePluginHooks,\n removeHooks,\n delHooksDescriptor,\n runHooks\n}\n","import Util from '../utils/util'\nimport Sniffer from '../utils/sniffer'\nimport Errors from '../error'\nimport * as Events from '../events'\nimport XG_DEBUG from '../utils/debug'\nimport hooksDescriptor, { hook, useHooks, removeHooks, delHooksDescriptor } from './hooksDescriptor'\n\nfunction showErrorMsg (pluginName, msg) {\n XG_DEBUG.logError(`[${pluginName}] event or callback cant be undefined or null when call ${msg}`)\n}\n\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef { import ('../defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * [propName: string]: any;\n * }} IBasePluginOptions\n */\nclass BasePlugin {\n static defineGetterOrSetter (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key)) {\n Object.defineProperty(Obj, key, map[key])\n }\n }\n }\n static defineMethod (Obj, map) {\n for (const key in map) {\n if (Object.prototype.hasOwnProperty.call(map, key) && typeof map[key] === 'function') {\n Object.defineProperty(Obj, key, {\n configurable: true,\n value: map[key]\n })\n }\n }\n }\n\n /**\n * @type { { [propName: string]: any } }\n */\n static get defaultConfig () {\n return {}\n }\n\n /**\n * @type { string }\n */\n static get pluginName () {\n return 'pluginName'\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n constructor (args) {\n if (Util.checkIsFunction(this.beforeCreate)) {\n this.beforeCreate(args)\n }\n hooksDescriptor(this)\n /**\n * @private\n */\n this.__args = args\n /**\n * @private\n */\n this.__events = {} // 对player的事件监听缓存\n this.__onceEvents = {}\n this.config = args.config || {}\n /**\n * @readonly\n * @type { Player }\n */\n this.player = null\n /**\n * @readonly\n * @type { IPlayerOptions }\n */\n this.playerConfig = {}\n /**\n * @readonly\n * @type {string}\n */\n this.pluginName = ''\n this.__init(args)\n }\n\n /**\n * @param { IBasePluginOptions } args\n */\n beforeCreate (args) {}\n afterCreate () {}\n beforePlayerInit () {}\n onPluginsReady () {}\n afterPlayerInit () {}\n destroy () {}\n\n /**\n * @protected\n * @param { any } args\n */\n __init (args) {\n this.player = args.player\n this.playerConfig = args.player && args.player.config\n this.pluginName = args.pluginName ? args.pluginName.toLowerCase() : this.constructor.pluginName.toLowerCase()\n this.logger = args.player && args.player.logger\n // BasePlugin.defineGetterOrSetter(this, {\n // player: {\n // get: () => {\n // return args.player\n // },\n // configurable: true\n // },\n // playerConfig: {\n // get: () => {\n // return args.player && args.player.config\n // },\n // configurable: true\n // },\n\n // pluginName: {\n // get: () => {\n // if (args.pluginName) {\n // return args.pluginName.toLowerCase()\n // } else {\n // return this.constructor.pluginName.toLowerCase()\n // }\n // },\n // configurable: true\n // },\n // logger: {\n // get: () => {\n // return args.player.logger\n // },\n // configurable: true\n // }\n // })\n }\n\n /**\n * 更新语言\n * @param { string } lang\n */\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n }\n\n /**\n * @type { string }\n */\n get lang () {\n return this.player.lang\n }\n\n get i18n () {\n return this.player.i18n\n }\n\n get i18nKeys () {\n return this.player.i18nKeys\n }\n\n /**\n * @description当前支持的事件类型\n * @type { 'touch' | 'mouse' }\n */\n get domEventType () {\n let _e = Util.checkTouchSupport() ? 'touch' : 'mouse'\n if (this.playerConfig && (this.playerConfig.domEventType === 'touch' || this.playerConfig.domEventType === 'mouse')) {\n _e = this.playerConfig.domEventType\n }\n return _e\n }\n\n /**\n *\n * @param { string | Array<string> } event\n * @param { Function } callback\n * @returns\n */\n on (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.on(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__events[event] = callback\n this.player.on(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__events[item] = callback\n this.player.on(item, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n once (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.once(event, callback)')\n return\n }\n if (typeof event === 'string') {\n this.__onceEvents[event] = callback\n this.player.once(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n this.__onceEvents[item] = callback\n this.player.once(event, callback)\n })\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } callback\n * @returns\n */\n off (event, callback) {\n if (!event || !callback || !this.player) {\n showErrorMsg(this.pluginName, 'plugin.off(event, callback)')\n return\n }\n if (typeof event === 'string') {\n delete this.__events[event]\n this.player.off(event, callback)\n } else if (Array.isArray(event)) {\n event.forEach((item) => {\n delete this.__events[event]\n this.player.off(item, callback)\n })\n }\n }\n\n offAll () {\n ['__events', '__onceEvents'].forEach(key => {\n Object.keys(this[key]).forEach(item => {\n this[key][item] && this.off(item, this[key][item])\n item && delete this[key][item]\n })\n })\n this.__events = {}\n this.__onceEvents = {}\n }\n\n /**\n *\n * @param { string } event\n * @param {...any} res\n * @returns\n */\n emit (event, ...res) {\n if (!this.player) {\n return\n }\n this.player.emit(event, ...res)\n }\n\n emitUserAction (event, action, params = {}) {\n if (!this.player) {\n return\n }\n const nParams = {\n ...params,\n pluginName: this.pluginName\n }\n this.player.emitUserAction(event, action, nParams)\n }\n\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n useHooks (hookName, handler, ...args) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removeHooks (hookName, handler, ...args) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n * 注册子插件\n * @param { any } plugin\n * @param { any } [options]\n * @param { string } [name]\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name = '') {\n if (!this.player) {\n return\n }\n name && (options.pluginName = name)\n return this.player.registerPlugin({ plugin, options })\n }\n\n /**\n *\n * @param { string } name\n * @returns { any | null }\n */\n getPlugin (name) {\n return this.player ? this.player.getPlugin(name) : null\n }\n\n __destroy () {\n const player = this.player\n const pluginName = this.pluginName\n this.offAll()\n Util.clearAllTimers(this)\n if (Util.checkIsFunction(this.destroy)) {\n this.destroy()\n }\n\n ['player', 'playerConfig', 'pluginName', 'logger', '__args', '__hooks'].map(item => {\n this[item] = null\n })\n player.unRegisterPlugin(pluginName)\n delHooksDescriptor(this)\n }\n}\nexport {\n BasePlugin as default,\n Util,\n Sniffer,\n Errors,\n Events,\n XG_DEBUG\n}\n","var DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n","var closest = require('./closest');\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n","/**\n* an ui Plugin class\n*\n**/\nimport BasePlugin, { Util, XG_DEBUG } from './basePlugin'\nimport delegate from 'delegate'\n\nconst ROOT_TYPES = {\n CONTROLS: 'controls',\n ROOT: 'root'\n}\n\nconst POSITIONS = {\n ROOT: 'root',\n ROOT_LEFT: 'rootLeft',\n ROOT_RIGHT: 'rootRight',\n ROOT_TOP: 'rootTop',\n CONTROLS_LEFT: 'controlsLeft',\n CONTROLS_RIGTH: 'controlsRight',\n CONTROLS_RIGHT: 'controlsRight',\n CONTROLS_CENTER: 'controlsCenter',\n CONTROLS: 'controls'\n}\n\nconst PLUGIN_STATE_CLASS = {\n ICON_DISABLE: 'xg-icon-disable',\n ICON_HIDE: 'xg-icon-hide'\n}\n\n/**\n * Check if the url is a link address\n * @param { string } str\n */\nfunction isUrl (str) {\n if (!str) {\n return false\n }\n return str.indexOf && /^(?:http|data:|\\/)/.test(str)\n}\n\nfunction mergeIconClass (icon, classname) {\n if (typeof icon === 'object' && icon.class && typeof icon.class === 'string') {\n return `${classname} ${icon.class}`\n }\n return classname\n}\n\nfunction mergeIconAttr (icon, attr) {\n if (typeof icon === 'object' && icon.attr && typeof icon.attr === 'object') {\n Object.keys(icon.attr).map(key => {\n attr[key] = icon.attr[key]\n })\n }\n return attr\n}\n\nfunction createIcon (icon, key, classname = '', attr = {}, pluginName = '') {\n let newIcon = null\n if (icon instanceof window.Element) {\n Util.addClass(icon, classname)\n Object.keys(attr).map(key => {\n icon.setAttribute(key, attr[key])\n })\n return icon\n }\n\n if (isUrl(icon) || isUrl(icon.url)) {\n attr.src = isUrl(icon) ? icon : (icon.url || '')\n newIcon = Util.createDom(icon.tag || 'img', '', attr, `xg-img ${classname}`)\n return newIcon\n }\n\n if (typeof icon === 'function') {\n try {\n newIcon = icon()\n if (newIcon instanceof window.Element) {\n Util.addClass(newIcon, classname)\n Object.keys(attr).map(key => {\n newIcon.setAttribute(key, attr[key])\n })\n return newIcon\n } else {\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is a function mast return an Element Object`)\n }\n return null\n } catch (e) {\n XG_DEBUG.logError(`Plugin named [${pluginName}]:createIcon`, e)\n return null\n }\n }\n\n if (typeof icon === 'string') {\n return Util.createDomFromHtml(icon, attr, classname)\n }\n XG_DEBUG.logWarn(`warn>>icons.${key} in config of plugin named [${pluginName}] is invalid`)\n return null\n}\n\nfunction registerIconsObj (iconsConfig, plugin) {\n const _icons = plugin.config.icons || plugin.playerConfig.icons\n Object.keys(iconsConfig).map(key => {\n const orgIcon = iconsConfig[key]\n let classname = orgIcon && orgIcon.class ? orgIcon.class : ''\n let attr = orgIcon && orgIcon.attr ? orgIcon.attr : {}\n let newIcon = null\n if (_icons && _icons[key]) {\n classname = mergeIconClass(_icons[key], classname)\n attr = mergeIconAttr(_icons[key], attr)\n newIcon = createIcon(_icons[key], key, classname, attr, plugin.pluginName)\n }\n if (!newIcon && orgIcon) {\n newIcon = createIcon((orgIcon.icon ? orgIcon.icon : orgIcon), attr, classname, {}, plugin.pluginName)\n }\n plugin.icons[key] = newIcon\n })\n}\n\nfunction registerTextObj (textConfig, plugin) {\n Object.keys(textConfig).map((key) => {\n Object.defineProperty(plugin.langText, key, {\n get: () => {\n const { lang, i18n } = plugin\n if (i18n[key]) {\n return i18n[key]\n } else {\n return textConfig[key] ? (textConfig[key][lang] || '') : ''\n }\n }\n })\n })\n}\n/**\n * @typedef { import ('../player').default } Player\n */\n\n/**\n * @typedef {{\n * index?: number,\n * player: Player,\n * pluginName: string,\n * config: {\n * [propName: string]: any\n * },\n * root?: HTMLElement,\n * position?: string,\n * [propName: string]: any\n * }} IPluginOptions\n*/\nclass Plugin extends BasePlugin {\n /**\n * 插入dom结构\n * @param { string | HTMLElement } html html字符串或者dom\n * @param { HTMLElement } parent\n * @param { number } index\n * @returns { HTMLElement }\n */\n static insert (html, parent, index = 0) {\n const len = parent.children.length\n const insertIdx = Number(index)\n const isDomElement = html instanceof window.Node\n\n if (len) {\n let i = 0\n let coordinate = null\n let mode = ''\n for (;i < len; i++) {\n coordinate = parent.children[i]\n const curIdx = Number(coordinate.getAttribute('data-index'))\n if (curIdx >= insertIdx) {\n mode = 'beforebegin'\n break\n } else if (curIdx < insertIdx) {\n mode = 'afterend'\n }\n }\n\n if (isDomElement) {\n if (mode === 'afterend') {\n // as last element\n parent.appendChild(html)\n } else {\n parent.insertBefore(html, coordinate)\n }\n } else {\n coordinate.insertAdjacentHTML(mode, html)\n }\n return mode === 'afterend' ? parent.children[parent.children.length - 1] : parent.children[i]\n } else {\n isDomElement ? parent.appendChild(html) : parent.insertAdjacentHTML('beforeend', html)\n return parent.children[parent.children.length - 1]\n }\n }\n\n static get defaultConfig () {\n return {}\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { string } querySelector\n * @param { string | Array<string> } eventType\n * @param { Function } callback\n * @param { boolean } [capture=false]\n * @returns\n */\n static delegate (root, querySelector, eventType, callback, capture = false) {\n const dels = []\n if (root instanceof window.Node && typeof callback === 'function') {\n if (Array.isArray(eventType)) {\n eventType.forEach((item) => {\n const ret = delegate(root, querySelector, item, callback, capture)\n ret.key = `${querySelector}_${item}`\n dels.push(ret)\n })\n } else {\n const ret = delegate(root, querySelector, eventType, callback, capture)\n ret.key = `${querySelector}_${eventType}`\n dels.push(ret)\n }\n }\n return dels\n }\n\n static get ROOT_TYPES () {\n return ROOT_TYPES\n }\n\n static get POSITIONS () {\n return POSITIONS\n }\n\n /**\n * @param { IPluginOptions } args\n */\n constructor (args = {}) {\n super(args)\n /**\n * @private\n */\n this.__delegates = []\n }\n\n /**\n * @protected\n */\n __init (args) {\n super.__init(args)\n if (!args.root) {\n return\n }\n const _parent = args.root\n let _el = null\n /**\n * @readonly\n */\n this.icons = {}\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.root = null\n /**\n * @readonly\n * @type { HTMLElement }\n */\n this.parent = null\n /**\n * store the extra HTMLElements except root\n * @readonly\n * @type {HTMLElement[]}\n */\n this.extraEls = []\n\n const _orgicons = this.registerIcons() || {}\n registerIconsObj(_orgicons, this)\n /**\n * @readonly\n */\n this.langText = {}\n const defaultTexConfig = this.registerLanguageTexts() || {}\n registerTextObj(defaultTexConfig, this)\n let renderStr = ''\n try {\n renderStr = this.render()\n } catch (e) {\n XG_DEBUG.logError(`Plugin:${this.pluginName}:render`, e)\n throw (new Error(`Plugin:${this.pluginName}:render:${e.message}`))\n }\n if (renderStr) {\n _el = Plugin.insert(renderStr, _parent, args.index)\n _el.setAttribute('data-index', args.index)\n } else if (args.tag) {\n _el = Util.createDom(args.tag, '', args.attr, args.name)\n _el.setAttribute('data-index', args.index)\n _parent.appendChild(_el)\n } else {\n return\n }\n\n this.root = _el\n this.parent = _parent\n\n // Plugin.defineGetterOrSetter(this, {\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // root: {\n // get: () => {\n // return _el\n // },\n // configurable: true\n // },\n // /**\n // * @readonly\n // * @type { HTMLElement }\n // */\n // parent: {\n // get: () => {\n // return _parent\n // },\n // configurable: true\n // }\n // })\n\n const attr = this.config.attr || {}\n const style = this.config.style || {}\n\n this.setAttr(attr)\n this.setStyle(style)\n if (this.config.index) {\n this.root.setAttribute('data-index', this.config.index)\n }\n this.__registerChildren()\n }\n\n /**\n * @private\n */\n __registerChildren () {\n if (!this.root) {\n return\n }\n /**\n * @private\n */\n this._children = []\n const children = this.children()\n if (children && typeof children === 'object') {\n if (Object.keys(children).length > 0) {\n Object.keys(children).map(item => {\n const name = item\n const _plugin = children[name]\n const options = {\n root: this.root\n }\n // eslint-disable-next-line no-unused-vars\n let config, Plugin\n if (typeof _plugin === 'function') {\n config = this.config[name] || {}\n Plugin = _plugin\n } else if (typeof _plugin === 'object' && typeof _plugin.plugin === 'function') {\n config = _plugin.options ? Util.deepCopy((this.config[name] || {}), _plugin.options) : (this.config[name] || {})\n Plugin = _plugin.plugin\n }\n options.config = config\n config.index !== undefined && (options.index = config.index)\n config.root && (options.root = config.root)\n this.registerPlugin(Plugin, options, name)\n })\n }\n }\n }\n\n updateLang (lang) {\n if (!lang) {\n lang = this.lang\n }\n function checkChildren (node, callback) {\n for (let i = 0; i < node.children.length; i++) {\n if (node.children[i].children.length > 0) {\n checkChildren(node.children[i], callback)\n } else {\n callback(node.children[i])\n }\n }\n }\n const { root, i18n, langText } = this\n if (root) {\n checkChildren(root, (node) => {\n const langKey = node.getAttribute && node.getAttribute('lang-key')\n if (!langKey) {\n return\n }\n const langTextShow = i18n[langKey.toUpperCase()] || langText[langKey]\n if (langTextShow) {\n node.innerHTML = typeof langTextShow === 'function' ? langTextShow(lang) : langTextShow\n }\n })\n }\n }\n\n get lang () {\n return this.player.lang\n }\n\n changeLangTextKey (dom, key = '') {\n const i18n = this.i18n || {}\n const langText = this.langText\n dom.setAttribute && dom.setAttribute('lang-key', key)\n const text = i18n[key] || langText[key] || ''\n if (text) {\n dom.innerHTML = text\n }\n }\n\n plugins () {\n return this._children\n }\n\n /**\n *\n */\n disable () {\n this.config.disable = true\n Util.addClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n enable () {\n this.config.disable = false\n Util.removeClass(this.find('.xgplayer-icon'), PLUGIN_STATE_CLASS.ICON_DISABLE)\n }\n\n children () {\n return {}\n }\n\n registerPlugin (plugin, options = {}, name = '') {\n options.root = options.root || this.root\n const _c = super.registerPlugin(plugin, options, name)\n this._children.push(_c)\n return _c\n }\n\n registerIcons () {\n return {}\n }\n\n registerLanguageTexts () {\n return {}\n }\n\n /**\n *\n * @param { string } qs\n * @returns { HTMLElement | null }\n */\n find (qs) {\n if (!this.root) {\n return\n }\n return this.root.querySelector(qs)\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n * @param { Function } [callback]\n */\n bind (querySelector, eventType, callback) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.bindEL(item, eventType)\n })\n } else {\n this.bindEL(querySelector, eventType)\n }\n } else {\n const ret = Plugin.delegate.call(this, this.root, querySelector, eventType, callback)\n this.__delegates = this.__delegates.concat(ret)\n }\n }\n\n /**\n * 绑定事件\n * @param { string | Array<string> } querySelector\n * @param { string | Array<string> | Function } eventType\n */\n unbind (querySelector, eventType) {\n if (arguments.length < 3 && typeof eventType === 'function') {\n if (Array.isArray(querySelector)) {\n querySelector.forEach((item) => {\n this.unbindEL(item, eventType)\n })\n } else {\n this.unbindEL(querySelector, eventType)\n }\n } else {\n const key = `${querySelector}_${eventType}`\n for (let i = 0; i < this.__delegates.length; i++) {\n if (this.__delegates[i].key === key) {\n this.__delegates[i].destroy()\n this.__delegates.splice(i, 1)\n break\n }\n }\n }\n }\n\n /**\n * 给插件设置样式\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setStyle (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return (this.root.style[name] = value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.style[key] = name[key]\n })\n }\n }\n\n /**\n * 给插件根节点设置属性\n * @param { string | {[propName: string]: any} } name\n * @param { ? | any } value\n * @returns\n */\n setAttr (name, value) {\n if (!this.root) {\n return\n }\n if (Util.typeOf(name) === 'String') {\n return this.root.setAttribute(name, value)\n } else if (Util.typeOf(name) === 'Object') {\n Object.keys(name).map(key => {\n this.root.setAttribute(key, name[key])\n })\n }\n }\n\n /**\n *\n * @param { string } htmlStr\n * @param { Function } [callback]\n * @returns\n */\n setHtml (htmlStr, callback) {\n if (!this.root) {\n return\n }\n this.root.innerHTML = htmlStr\n if (typeof callback === 'function') {\n callback()\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble=false]\n * @returns\n */\n bindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.addEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } event\n * @param { Function } eventHandle\n * @param { boolean } [isBubble]\n * @returns\n */\n unbindEL (event, eventHandle, isBubble = false) {\n if (!this.root) {\n return\n }\n if (`on${event}` in this.root && typeof eventHandle === 'function') {\n this.root.removeEventListener(event, eventHandle, isBubble)\n }\n }\n\n /**\n *\n * @param { string } [value]\n * @returns\n */\n show (value) {\n if (!this.root) {\n return\n }\n this.root.style.display = value !== undefined ? value : 'block'\n const cs = window.getComputedStyle(this.root, null)\n const cssDisplayValue = cs.getPropertyValue('display')\n if (cssDisplayValue === 'none') {\n return (this.root.style.display = 'block')\n }\n }\n\n hide () {\n this.root && (this.root.style.display = 'none')\n }\n\n /**\n *\n * @param { string | HTMLElement } pdom\n * @param { HTMLElement} child\n * @returns { HTMLElement | null }\n */\n appendChild (pdom, child) {\n if (!this.root) {\n return null\n }\n if (arguments.length < 2 && arguments[0] instanceof window.Element) {\n return this.root.appendChild(arguments[0])\n }\n if (!child || !(child instanceof window.Element)) {\n return null\n }\n try {\n if (typeof pdom === 'string') {\n return this.find(pdom).appendChild(child)\n } else {\n return pdom.appendChild(child)\n }\n } catch (err) {\n XG_DEBUG.logError('Plugin:appendChild', err)\n return null\n }\n }\n\n /**\n *\n * @returns { string | HTMLElement }\n */\n render () {\n return ''\n }\n\n destroy () {}\n\n __destroy () {\n const { player } = this\n this.__delegates.map(item => {\n item.destroy()\n })\n this.__delegates = []\n // destroy the sub-plugin instance\n if (this._children instanceof Array) {\n this._children.map(item => {\n player.unRegisterPlugin(item.pluginName)\n })\n this._children = null\n }\n if (this.root) {\n // eslint-disable-next-line no-prototype-builtins\n if (this.root.hasOwnProperty('remove')) {\n this.root.remove()\n } else if (this.root.parentNode) {\n this.root.parentNode.removeChild(this.root)\n }\n }\n\n super.__destroy()\n this.icons = {};\n ['root', 'parent'].map(item => {\n this[item] = null\n })\n this.extraEls = []\n }\n}\n\nexport {\n Plugin as default,\n ROOT_TYPES,\n POSITIONS,\n PLUGIN_STATE_CLASS\n}\n","import { throttle } from '../utils/util'\nimport { PLATER_ID } from '../constant'\n/**\n * 添加\n */\nclass ResizeObserver {\n constructor () {\n this.__handlers = []\n this.timeStamp = 0\n this.observer = null\n if (!window.ResizeObserver) {\n return\n }\n try {\n this.observer = new window.ResizeObserver(throttle(this.__trigger, 100, { trailing: true }))\n this.timeStamp = new Date().getTime()\n } catch (e) {\n console.error(e)\n }\n }\n\n addObserver (target, handler) {\n if (!this.observer) {\n return\n }\n this.observer.observe(target)\n const _pid = target.getAttribute(PLATER_ID)\n const { __handlers } = this\n let index = -1\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n index = i\n }\n }\n if (index > -1) {\n this.__handlers[index].handler = handler\n } else {\n this.__handlers.push({\n target,\n handler: handler,\n playerId: _pid\n })\n }\n }\n\n unObserver (target) {\n let i = -1\n this.__handlers.map((item, index) => {\n if (target === item.target) {\n i = index\n }\n })\n try {\n this.observer?.unobserve(target)\n } catch (e) {}\n i > -1 && this.__handlers.splice(i, 1)\n }\n\n destroyObserver () {\n this.observer?.disconnect()\n this.observer = null\n this.__handlers = null\n }\n\n __runHandler (target) {\n const { __handlers } = this\n for (let i = 0; i < __handlers.length; i++) {\n if (__handlers[i] && target === __handlers[i].target) {\n try {\n __handlers[i].handler(target)\n } catch (error) {\n console.error(error)\n }\n return true\n }\n }\n return false\n }\n\n __trigger = (entries) => {\n const t = new Date().getTime()\n this.timeStamp = t\n for (let i = 0; i < entries.length; i++) {\n this.__runHandler(entries[i].target)\n }\n }\n}\n\n/**\n * @type {ResizeObserver | null}\n */\nlet resizeObserver = null\n\nfunction addObserver (target, handler) {\n if (!resizeObserver) {\n resizeObserver = new ResizeObserver()\n // window.___resizeObserver = resizeObserver\n }\n resizeObserver.addObserver(target, handler)\n return resizeObserver\n}\n\nfunction unObserver (target, handler) {\n resizeObserver?.unObserver(target, handler)\n}\n\nfunction destroyObserver (target, handler) {\n resizeObserver?.destroyObserver(target, handler)\n}\n\nexport {\n addObserver,\n unObserver,\n destroyObserver\n}\n","import { addObserver, unObserver } from './resizeObserver'\nimport Util from '../utils/util'\n\n/**\n* a plugins manager to register and search\n**/\n\nconst pluginsManager = {\n pluginGroup: {},\n init (player) {\n // mark every player instance by _pluginInfoId\n let cgid = player._pluginInfoId\n if (!cgid) {\n cgid = new Date().getTime()\n player._pluginInfoId = cgid\n }\n\n !player.config.closeResizeObserver && addObserver(player.root, () => {\n player.resize()\n })\n\n this.pluginGroup[cgid] = {\n _originalOptions: player.config || {},\n _plugins: {}\n }\n },\n\n formatPluginInfo (plugin, config) {\n let PLUFGIN = null\n let options = null\n if (plugin.plugin && typeof plugin.plugin === 'function') {\n PLUFGIN = plugin.plugin\n options = plugin.options\n } else {\n PLUFGIN = plugin\n options = {}\n }\n if (config) {\n options.config = config || {}\n }\n\n return {\n PLUFGIN,\n options\n }\n },\n\n /**\n * check the plugin if exits in plugins\n * @param {string} pluginName\n * @param { Array <any> } plugins\n * @returns boolean\n */\n checkPluginIfExits (pluginName, plugins) {\n for (let i = 0; i < plugins.length; i++) {\n if (pluginName.toLowerCase() === plugins[i].pluginName.toLowerCase()) {\n return true\n }\n }\n return false\n },\n\n /**\n * get plugin Config from playerConfig\n * @param { string } pluginName\n * @param { {[propName: string]: any;} } playerConfig\n * @return { {[propName: string]: any;} } pluginConfig\n */\n getRootByConfig (pluginName, playerConfig) {\n const keys = Object.keys(playerConfig)\n let _pConfig = null\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n _pConfig = playerConfig[keys[i]]\n break\n }\n }\n\n if (Util.typeOf(_pConfig) === 'Object') {\n return {\n root: _pConfig.root,\n position: _pConfig.position\n }\n }\n return {}\n },\n\n /**\n * register a lazy plugin\n * @param { any } player instance\n * @param { any } lazyPlugin config\n *\n */\n lazyRegister (player, lazyPlugin) {\n const timeout = lazyPlugin.timeout || 1500\n return Promise.race([\n lazyPlugin.loader().then((plugin) => {\n let result\n if (plugin && plugin.__esModule) {\n result = plugin.default\n } else {\n result = plugin\n }\n this.register(player, result, plugin.options)\n }),\n new Promise((resolve, reject) => {\n setTimeout(() => {\n reject(new Error('timeout'))\n }, timeout)\n })\n ])\n },\n /**\n * register a Plugin\n * @param { any } player the plugins register\n * @param { any } plugin the plugin contructor\n * @param { any } options the plugin configuration\n * @return { any } Plugin the plugin instance\n **/\n register (player, plugin, options = {}) {\n if (!player || !plugin || typeof plugin !== 'function' || plugin.prototype === undefined) {\n return\n }\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n if (!this.pluginGroup[cgid]._plugins) {\n this.pluginGroup[cgid]._plugins = {}\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const originalOptions = this.pluginGroup[cgid]._originalOptions\n options.player = player\n\n const pluginName = options.pluginName || plugin.pluginName\n if (!pluginName) {\n throw new Error('The property pluginName is necessary')\n }\n\n if (plugin.isSupported && !plugin.isSupported(player.config.mediaType, player.config.codecType)) {\n console.warn(`not supported plugin [${pluginName}]`)\n return\n }\n\n if (!options.config) {\n options.config = {}\n }\n\n // get config items from player.config\n const keys = Object.keys(originalOptions)\n for (let i = 0; i < keys.length; i++) {\n if (pluginName.toLowerCase() === keys[i].toLowerCase()) {\n const config = originalOptions[keys[i]]\n if (Util.typeOf(config) === 'Object') {\n options.config = Object.assign({}, options.config, originalOptions[keys[i]])\n } else if (Util.typeOf(config) === 'Boolean') {\n options.config.disable = !config\n }\n break\n }\n }\n\n // copy the default configuration items of the plugin\n if (plugin.defaultConfig) {\n Object.keys(plugin.defaultConfig).forEach(key => {\n if (typeof options.config[key] === 'undefined') {\n options.config[key] = plugin.defaultConfig[key]\n }\n })\n }\n\n // get the parent dom which added the plugin will be mounted\n if (!options.root) {\n options.root = player.root\n } else if (typeof options.root === 'string') {\n options.root = player[options.root]\n }\n\n options.index = options.config.index || 0\n try {\n // if there is already a plugin instance with the same pluginName, destroy it\n if (plugins[pluginName.toLowerCase()]) {\n this.unRegister(cgid, pluginName.toLowerCase())\n console.warn(`the is one plugin with same pluginName [${pluginName}] exist, destroy the old instance`)\n }\n // eslint-disable-next-line new-cap\n const _instance = new plugin(options)\n plugins[pluginName.toLowerCase()] = _instance\n plugins[pluginName.toLowerCase()].func = plugin\n if (_instance && typeof _instance.afterCreate === 'function') {\n _instance.afterCreate()\n }\n return _instance\n } catch (err) {\n console.error(err)\n throw (err)\n }\n },\n\n /**\n * Unregister a plugin from player instance\n * @param { string } cgid\n * @param { string } name\n */\n unRegister (cgid, name) {\n if (cgid._pluginInfoId) {\n cgid = cgid._pluginInfoId\n }\n name = name.toLowerCase()\n try {\n const plugin = this.pluginGroup[cgid]._plugins[name]\n if (plugin) {\n plugin.pluginName && plugin.__destroy()\n delete this.pluginGroup[cgid]._plugins[name]\n }\n } catch (e) {\n console.error(`[unRegister:${name}] cgid:[${cgid}] error`, e)\n }\n },\n\n /**\n * remove a plugin instance from the player plugin list\n * @param { any } player\n * @param { string } name\n */\n deletePlugin (player, name) {\n const cgid = player._pluginInfoId\n if (cgid && this.pluginGroup[cgid] && this.pluginGroup[cgid]._plugins) {\n delete this.pluginGroup[cgid]._plugins[name]\n }\n },\n\n /**\n * get all plugin instance of player\n * @param { any } player\n */\n getPlugins (player) {\n const cgid = player._pluginInfoId\n return cgid && this.pluginGroup[cgid] ? this.pluginGroup[cgid]._plugins : {}\n },\n\n findPlugin (player, name) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return null\n }\n const cName = name.toLowerCase()\n return this.pluginGroup[cgid]._plugins[cName]\n },\n\n beforeInit (player) {\n function retPromise (fun) {\n if (!fun || !fun.then) {\n return new Promise((resolve) => {\n resolve()\n })\n } else {\n return fun\n }\n }\n return new Promise((resolve) => {\n if (!this.pluginGroup) {\n return\n }\n\n let prevTask\n if (player._loadingPlugins && player._loadingPlugins.length) {\n prevTask = Promise.all(player._loadingPlugins)\n } else {\n prevTask = Promise.resolve()\n }\n\n return prevTask.then(() => {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n resolve()\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n const pluginsRet = []\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].beforePlayerInit) {\n try {\n const ret = plugins[pName].beforePlayerInit()\n pluginsRet.push(retPromise(ret))\n } catch (e) {\n pluginsRet.push(retPromise(null))\n throw e\n }\n }\n })\n\n Promise.all([...pluginsRet]).then(() => {\n resolve()\n }).catch((e) => {\n console.error(e)\n resolve()\n })\n })\n })\n },\n\n afterInit (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (plugins[pName] && plugins[pName].afterPlayerInit) {\n plugins[pName].afterPlayerInit()\n }\n })\n },\n\n setLang (lang, player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(item => {\n if (plugins[item].updateLang) {\n plugins[item].updateLang(lang)\n } else {\n // 兼容旧版本通过set lang更新语言的问题\n try {\n plugins[item].lang = lang\n } catch (error) {\n console.warn(`${item} setLang`)\n }\n }\n })\n },\n\n reRender (player) {\n const cgid = player._pluginInfoId\n\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const _pList = []\n const plugins = this.pluginGroup[cgid]._plugins\n Object.keys(plugins).forEach(pName => {\n if (pName !== 'controls' && plugins[pName]) {\n _pList.push({\n plugin: plugins[pName].func,\n options: plugins[pName].__args\n })\n this.unRegister(cgid, pName)\n }\n })\n _pList.forEach(item => {\n this.register(player, item.plugin, item.options)\n })\n },\n\n onPluginsReady (player) {\n const cgid = player._pluginInfoId\n if (!cgid || !this.pluginGroup[cgid]) {\n return\n }\n const plugins = this.pluginGroup[cgid]._plugins || {}\n Object.keys(plugins).forEach(key => {\n if (plugins[key].onPluginsReady && typeof plugins[key].onPluginsReady === 'function') {\n plugins[key].onPluginsReady()\n }\n })\n },\n\n destroy (player) {\n const cgid = player._pluginInfoId\n if (!this.pluginGroup[cgid]) {\n return\n }\n unObserver(player.root)\n const plugins = this.pluginGroup[cgid]._plugins\n for (const item of Object.keys(plugins)) {\n this.unRegister(cgid, item)\n }\n delete this.pluginGroup[cgid]\n delete player._pluginInfoId\n }\n}\n\nexport default pluginsManager\n","export default {\n DEFAULT: 'xgplayer',\n DEFAULT_SKIN: 'xgplayer-skin-default',\n ENTER: 'xgplayer-is-enter',\n PAUSED: 'xgplayer-pause',\n PLAYING: 'xgplayer-playing',\n ENDED: 'xgplayer-ended',\n CANPLAY: 'xgplayer-canplay',\n LOADING: 'xgplayer-isloading',\n ERROR: 'xgplayer-is-error',\n REPLAY: 'xgplayer-replay',\n NO_START: 'xgplayer-nostart',\n ACTIVE: 'xgplayer-active',\n INACTIVE: 'xgplayer-inactive',\n FULLSCREEN: 'xgplayer-is-fullscreen',\n CSS_FULLSCREEN: 'xgplayer-is-cssfullscreen',\n ROTATE_FULLSCREEN: 'xgplayer-rotate-fullscreen',\n PARENT_ROTATE_FULLSCREEN: 'xgplayer-rotate-parent',\n PARENT_FULLSCREEN: 'xgplayer-fullscreen-parent',\n INNER_FULLSCREEN: 'xgplayer-fullscreen-inner',\n NO_CONTROLS: 'no-controls',\n FLEX_CONTROLS: 'flex-controls',\n CONTROLS_FOLLOW: 'controls-follow',\n CONTROLS_AUTOHIDE: 'controls-autohide',\n TOP_BAR_AUTOHIDE: 'top-bar-autohide',\n NOT_ALLOW_AUTOPLAY: 'not-allow-autoplay',\n SEEKING: 'seeking',\n PC: 'xgplayer-pc',\n MOBILE: 'xgplayer-mobile',\n MINI: 'xgplayer-mini' // mini screen play status\n}\n","import { getLang } from './utils/util'\n\n/**\n * @typedef { string | MediaStream | Array<{src: string, type?:string, [propName: string]: any}> } IUrl\n */\n\n/**\n * @typedef {{\n * url: IUrl,\n * definition: any,\n * bitrate?: number,\n * bandwidth?: number,\n * text?: string | { [propName: string]: any },\n * iconText?: string | { [propName: string]: any },\n * [propName: string]: any\n * }} IDefinition\n */\n\n/**\n * @typedef { {\n * id?: string,\n * el?: HTMLElement,\n * mediaEl?: HTMLMediaElement | (mediaConfig: { [propName: string]: any }) => HTMLMediaElement,\n * url?: IUrl,\n * domEventType?: 'default' | 'touch' | 'mouse',\n * nullUrlStart?: boolean,\n * width?: number | string,\n * height?: number | string,\n * fluid?: boolean,\n * fitVideoSize?: 'fixWidth'|'fixHeight'|'fixed',\n * videoFillMode?: 'auto'|'fillHeight'|'fillWidth'|'fill'|'cover'|'contain',\n * volume?: number | { [propName: string]: any },\n * autoplay?: boolean,\n * autoplayMuted?: boolean,\n * loop?: boolean,\n * isLive?: boolean,\n * zoom?: number,\n * videoInit?: boolean,\n * poster?: string | { [propName: string]: any },\n * isMobileSimulateMode?: 'mobile' | 'pc',\n * defaultPlaybackRate?: number,\n * execBeforePluginsCall?: () => any,\n * allowSeekAfterEnded?: boolean,\n * enableContextmenu?: boolean,\n * closeVideoClick?: boolean,\n * closeVideoDblclick?: boolean,\n * closePlayerBlur?: boolean,\n * closeDelayBlur?: boolean,\n * leavePlayerTime?: number,\n * closePlayVideoFocus?: boolean,\n * closePauseVideoFocus?: boolean,\n * closeFocusVideoFocus?: boolean,\n * closeControlsBlur?: boolean,\n * topBarAutoHide?: boolean,\n * videoAttributes?: { [propName: string]: any },\n * startTime?: number,\n * seekedStatus?: 'play' | 'pause' | 'auto',\n * miniprogress?: boolean,\n * disableSwipeHandler?: () => any,\n * enableSwipeHandler?: () => any,\n * preProcessUrl?: (url: IUrl, ext?: { [propName: string]: any }) => { url: IUrl, [propName: string]: any },\n * ignores?: Array<'cssfullscreen' | 'screenshot' | 'pip' | 'miniscreen' | 'keyboard' | 'download' | 'playbackrate' | 'time' | 'definition' | 'error' | 'fullscreen' | 'loading' | 'mobile' | 'pc' | 'play' | 'poster' | 'progress' | 'replay' | 'start' | 'volume' | string>,\n * inactive?: number,\n * lang?: string,\n * controls?: boolean | { [propName: string]: any },\n * marginControls?: boolean,\n * fullscreenTarget?: HTMLElement, // 全屏作用的dom元素\n * screenShot?: boolean | { [propName: string]: any },\n * rotate?: boolean | { [propName: string]: any },\n * pip?: boolean | { [propName: string]: any },\n * download?: boolean | { [propName: string]: any },\n * mini?: boolean | { [propName: string]: any },\n * cssFullscreen?: boolean | { [propName: string]: any },\n * keyShortcut?: boolean,\n * presets?: any[],\n * plugins?: any[]\n * playbackRate?: boolean | Array<number> | { [propName: string]: any },\n * definition?: { list: Array<IDefinition> , defaultDefinition?: IDefinition['definition'], [propName: string]: any},\n * playsinline?: boolean,\n * customDuration?: number,\n * timeOffset?: number,\n * icons?: { [propName: string]: string | HTMLElement | () => HTMLElement | string },\n * i18n?: Array<any>,\n * tabindex?: number,\n * thumbnail?: {\n * urls: Array<string>,\n * pic_num: number,\n * col: number,\n * row: number,\n * height?: number,\n * width?: number,\n * },\n * videoConfig?: { [propName: string]: any },\n * isHideTips?: boolean,\n * minWaitDelay?: number,\n * commonStyle?: {\n * progressColor?: string,\n * playedColor?: string,\n * cachedColor?: string,\n * sliderBtnStyle?: { [propName: string]: any },\n * volumeColor?: string\n * },\n * remainMediaAfterDestroy?: boolean,\n * [propName: string]: any;\n * } } IPlayerOptions\n */\n\n/**\n * @returns { IPlayerOptions }\n */\nexport default function getDefaultConfig () {\n return {\n id: '', // container DOM id\n el: null, // container domElement\n url: '', // the url need to play\n domEventType: 'default', // 事件类型,默认值default, touch | mouse\n nullUrlStart: false, // Whether to start broadcasting with empty url\n width: 600, // Width, unit px\n height: 337.5, // height, unit px\n fluid: false,\n fitVideoSize: 'fixed', // adaptation method of container width and height, fixWidth/fixHeight/fixed/auto\n videoFillMode: 'auto', // video screen fill mode, fillHeight/fillWidth/fill/auto/cover\n volume: 0.6, // default volume or config of plug-in volume\n autoplay: false,\n autoplayMuted: false, // whether to mute the start\n loop: false, // whether to loop\n isLive: false, // whether is live\n zoom: 1,\n videoInit: true, // whether to load the video/audio when initializing\n poster: '', // cover poster url or the configuration object for poster plugin\n isMobileSimulateMode: false, // simulation state, mobile/pc\n defaultPlaybackRate: 1, // default playback rate\n execBeforePluginsCall: null,\n allowSeekAfterEnded: true, // whether to allow seek after the playback ended\n enableContextmenu: true, // whether to allow the right-click function to be enabled\n closeVideoClick: false, // is to close the video’s click/touchend behavior to switch playback and pause\n closeVideoDblclick: false, // is to close the video`s double-click behavior to switch through full screen\n closePlayerBlur: false, // whether to close the behavior of calling player.blur() when the mouse moves out of the player area\n closeDelayBlur: false, // whether to close the automatic hide control bar behavior,only PC\n leavePlayerTime: 3000, // auto hide delay time when the mouse moves out of the player area\n closePlayVideoFocus: false, // whether to close the behavior of calling player.focus() in the play event callback\n closePauseVideoFocus: false, // whether to close the behavior of calling player.focus() in the pause event callback\n closeFocusVideoFocus: true, // whether to close the behavior of calling player.media.focus() when start play\n closeControlsBlur: true, // whether to close the behavior of calling player.focus() when the mouse moves out of the control bar area\n topBarAutoHide: true, // Whether to enable auto hide the top bar when player.blur()\n videoAttributes: {}, // video extended attributes\n startTime: 0, // auto play start time\n seekedStatus: 'play', // play state after seek ends play/pause/auto\n miniprogress: false, // whether to enable the mini progress bar\n disableSwipeHandler: () => {\n },\n enableSwipeHandler: () => {\n },\n preProcessUrl: null, // url preprocessing callback\n ignores: [], // list of plug-in names to be disabled\n whitelist: [],\n inactive: 3000, // delay time for the control bar to disappear automatically\n lang: getLang(),\n controls: true,\n marginControls: false, // Whether the control bar is located at the bottom of the video and does not overlap with the video\n fullscreenTarget: null,\n screenShot: false, // whether to enable the screenshot plug-in\n rotate: false, // whether to enable the rotate plug-in\n pip: false, // whether to enable the picture-in-picture plug-in\n download: false, // whether to enable the download plug-in\n mini: false, // whether to enable the mini-screen plug-in\n cssFullscreen: true, // whether to enable the web page full-screen plug-in\n keyShortcut: true, // whether to open the shortcut key\n presets: [],\n plugins: [],\n playbackRate: 1,\n definition: { list: [] },\n playsinline: true,\n customDuration: 0, // User-defined duration\n timeOffset: 0, // currentTime offset\n icons: {},\n i18n: [],\n tabindex: 0, // The order of mediaElement focus\n thumbnail: null, // Preview image configuration\n videoConfig: {}, // video attribute configuration\n isHideTips: false, // if hide the icon tips\n minWaitDelay: 200, // The min threshold of waiting delay time\n commonStyle: { // General style configuration\n progressColor: '', // Background color of progress bar\n playedColor: '', // The background color of played part in the progress bar\n cachedColor: '', // The background color of cached part in the progress bar\n sliderBtnStyle: {}, // progress bar slider style\n volumeColor: ''\n }\n }\n}\n","export const usePreset = (player, Preset) => {\n let presetInst\n if (Preset.preset && Preset.options) {\n // eslint-disable-next-line new-cap\n presetInst = new (Preset.preset)(Preset.options, player.config)\n } else {\n presetInst = new Preset({}, player.config)\n }\n const { plugins = [], ignores = [], icons = {}, i18n = [] } = presetInst\n if (!player.config.plugins) {\n player.config.plugins = []\n }\n\n if (!player.config.ignores) {\n player.config.ignores = []\n }\n\n player.config.plugins.push(...plugins)\n player.config.ignores.push(...ignores)\n Object.keys(icons).map(key => {\n if (!player.config.icons[key]) {\n player.config.icons[key] = icons[key]\n }\n })\n const _ci18n = player.config.i18n || []\n i18n.push(..._ci18n)\n player.config.i18n = i18n\n}\n","export const STATES = {\n INITIAL: 1,\n READY: 2,\n ATTACHING: 3,\n ATTACHED: 4,\n NOTALLOW: 5,\n RUNNING: 6,\n ENDED: 7,\n DESTROYED: 8\n}\n\nexport const STATE_ARRAY = [\n 'ERROR',\n 'INITIAL',\n 'READY',\n 'ATTACHING',\n 'ATTACHED',\n 'NOTALLOW',\n 'RUNNING',\n 'ENDED',\n 'DESTROYED'\n]\n","import Plugin, { Events, Util, POSITIONS, Sniffer, STATE_CLASS } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * disable?: boolean,\n * autoHide?: boolean,\n * mode?: \"flex\"|\"normal\"|\"bottom\",\n * initShow?: boolean,\n * [propName: string]: any\n * }} IControlsConfig\n */\n\nclass Controls extends Plugin {\n static get pluginName () {\n return 'controls'\n }\n\n /**\n * @type IControlsConfig\n */\n static get defaultConfig () {\n return {\n disable: false,\n autoHide: true, // Whether to hide automatically\n mode: '', // Display mode, flex/normal/bottom\n initShow: false // Display when player is initialized\n }\n }\n\n beforeCreate (args) {\n if (!args.config.mode && Sniffer.device === 'mobile') {\n args.config.mode = 'flex'\n }\n if (args.player.config.marginControls) {\n args.config.autoHide = false\n }\n }\n\n afterCreate () {\n const { disable, height, mode } = this.config\n if (disable) {\n return\n }\n\n mode === 'flex' && this.player.addClass(STATE_CLASS.FLEX_CONTROLS)\n const style = {\n height: `${height}px`\n }\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.left = this.find('xg-left-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.center = this.find('xg-center-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.right = this.find('xg-right-grid')\n /**\n * @type { HTMLElement}\n * @readonly\n */\n this.innerRoot = this.find('xg-inner-controls')\n\n // The progress bar is switched synchronously when switching to the small window state\n this.on(Events.MINI_STATE_CHANGE, (isMini) => {\n isMini ? Util.addClass(this.root, 'mini-controls') : Util.removeClass(this.root, 'mini-controls')\n })\n\n const { isMobileSimulateMode } = this.playerConfig\n if (Sniffer.device !== 'mobile' && isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseleave', this.onMouseLeave)\n }\n }\n\n onMouseEnter = (e) => {\n const { player, playerConfig } = this\n playerConfig.closeControlsBlur && player.focus({ autoHide: false })\n }\n\n onMouseLeave = (e) => {\n const { player } = this\n player.focus()\n }\n\n focus () {\n this.player.focus({ autoHide: false })\n }\n\n focusAwhile () {\n this.player.focus({ autoHide: true })\n }\n\n blur () {\n this.player.blur({ ignorePaused: true })\n }\n\n recoverAutoHide () {\n // this.config.autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n this.config.autoHide && Util.addClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n pauseAutoHide () {\n // Util.removeClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n Util.removeClass(this.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root.style.display = ''\n this.player.focus()\n }\n\n hide () {\n this.root.style.display = 'none'\n }\n\n /**\n * @type {string}\n */\n get mode () {\n return this.config.mode\n }\n\n /**\n *\n * @param {} plugin\n * @param { {config?: {[propName: string]: any}, position?:string, root?: HTMLElement, pluginName?: string}} options\n * @param { string } name\n * @returns { any }\n */\n registerPlugin (plugin, options = {}, name) {\n if (!this.root) {\n return\n }\n const defaultConfig = plugin.defaultConfig || {}\n if (!options.root) {\n const position = options.position ? options.position : options.config && options.config.position ? options.config.position : defaultConfig.position\n switch (position) {\n case POSITIONS.CONTROLS_LEFT:\n options.root = this.left\n break\n case POSITIONS.CONTROLS_RIGHT:\n options.root = this.right\n break\n case POSITIONS.CONTROLS_CENTER:\n options.root = this.center\n break\n case POSITIONS.CONTROLS:\n options.root = this.root\n break\n default:\n options.root = this.left\n }\n return super.registerPlugin(plugin, options, name)\n }\n }\n\n destroy () {\n if (Sniffer.device !== 'mobile') {\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mouseleave', this.onMouseLeave)\n }\n this.left = null\n this.center = null\n this.right = null\n this.innerRoot = null\n }\n\n render () {\n const { mode, autoHide, initShow, disable } = this.config\n if (disable) {\n return\n }\n\n // autoHide && Util.addClass(this.player.root, STATE_CLASS.CONTROLS_AUTOHIDE)\n const className = Util.classNames(\n { 'xgplayer-controls': true },\n { 'flex-controls': mode === 'flex' },\n { 'bottom-controls': mode === 'bottom' },\n { [STATE_CLASS.CONTROLS_AUTOHIDE]: autoHide },\n { 'xgplayer-controls-initshow': initShow || !autoHide })\n return `<xg-controls class=\"${className}\" unselectable=\"on\">\n <xg-inner-controls class=\"xg-inner-controls xg-pos\">\n <xg-left-grid class=\"xg-left-grid\">\n </xg-left-grid>\n <xg-center-grid class=\"xg-center-grid\"></xg-center-grid>\n <xg-right-grid class=\"xg-right-grid\">\n </xg-right-grid>\n </xg-inner-controls>\n </xg-controls>`\n }\n}\n\nexport default Controls\n","import MediaProxy from './mediaProxy'\nimport Util, { checkIsCurrentVideo } from './utils/util'\nimport Sniffer from './utils/sniffer'\nimport Database from './utils/database'\nimport Errors from './error'\nimport * as Events from './events'\nimport { FULLSCREEN_EVENTS, GET_FULLSCREEN_API, EXIT_FULLSCREEN_API, PLATER_ID } from './constant'\nimport Plugin, { POSITIONS } from './plugin/plugin'\nimport BasePlugin from './plugin/basePlugin'\nimport pluginsManager from './plugin/pluginsManager'\nimport STATE_CLASS from './stateClassMap'\nimport getDefaultConfig from './defaultConfig'\nimport { usePreset } from './plugin/preset'\nimport hooksDescriptor, { runHooks, useHooks, removeHooks, delHooksDescriptor, usePluginHooks, removePluginHooks, hook } from './plugin/hooksDescriptor'\nimport Controls from './plugins/controls/index'\nimport XG_DEBUG, { bindDebug } from './utils/debug'\nimport I18N from './lang/i18n'\nimport version from './version'\nimport { STATES, STATE_ARRAY } from './state'\nimport { InstManager, checkPlayerRoot } from './instManager'\n\n/**\n * @typedef { import ('./defaultConfig').IPlayerOptions } IPlayerOptions\n */\n\n/**\n * @typedef { import ('./defaultConfig').IDefinition } IDefinition\n * @typedef { import ('./defaultConfig').IUrl } IUrl\n */\n\n/**\n * @typedef {boolean | {\n * seamless?: boolean,\n * currentTime?: number,\n * bitrate?: number\n * }} SwitchUrlOptions\n */\n\n/* eslint-disable camelcase */\nconst PLAYER_HOOKS = ['play', 'pause', 'replay', 'retry']\nlet REAL_TIME_SPEED = 0 // 实时下载速率, kb/s\nlet AVG_SPEED = 0 // 平均下载速率, kb/s\n/** @type { InstManager } */\nlet instManager = null\n\nclass Player extends MediaProxy {\n /**\n * @type {number}\n * @description set debugger level\n * 1 - only print error logs\n * 2 - print warn logs and error logs\n * 3 - print all debug logs and error stack logs\n */\n static set debugger (value) {\n XG_DEBUG.config.debug = value\n }\n\n static get debugger () {\n return XG_DEBUG.config.debug\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static set instManager (value) {\n instManager = value\n }\n\n /**\n * @param {import('./instManager').InstManager} value\n */\n static get instManager () {\n return instManager\n }\n\n /**\n * 获取当前处理激活态的实例id\n * @returns { number | string | null }\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.getActiveId()\n */\n static getCurrentUserActivePlayerId () {\n return instManager?.getActiveId()\n }\n\n /**\n * 设置实例的用户行为激活状态\n * @param { number | string } playerId\n * @param { boolean } isActive\n * @deprecated 该方法转移到 InstManager 上去使用: player.instManager.setActive()\n */\n static setCurrentUserActive (playerId, isActive) {\n instManager?.setActive(playerId, isActive)\n }\n\n /**\n * @param { IPlayerOptions } options\n */\n constructor (options) {\n const config = Util.deepMerge(getDefaultConfig(), options)\n super(config)\n hooksDescriptor(this, PLAYER_HOOKS)\n\n /**\n * @type { IPlayerOptions }\n * @description 当前播放器的配置信息\n */\n this.config = config\n\n /**\n * @type { string }\n * @private\n */\n this._pluginInfoId = Util.generateSessionId()\n\n bindDebug(this)\n // resolve default preset\n const defaultPreset = this.constructor.defaultPreset\n if (this.config.presets.length) {\n const defaultIdx = this.config.presets.indexOf('default')\n if (defaultIdx >= 0 && defaultPreset) {\n this.config.presets[defaultIdx] = defaultPreset\n }\n } else if (defaultPreset) {\n this.config.presets.push(defaultPreset)\n }\n\n // timer and flags\n this.userTimer = null\n /**\n * @private\n */\n this.waitTimer = null\n\n /**\n * @public\n * @description This switch provides the playback plugin with the ability\n * to handle media source by itself.\n */\n this.handleSource = true\n\n /**\n * @private\n */\n this._state = STATES.INITIAL\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isAd = false\n\n /**\n * @public\n * @readonly\n * @type { boolean }\n */\n this.isError = false\n\n /**\n * @private\n */\n this._hasStart = false\n\n /**\n * Whether the player is in the seeking state\n * @type { boolean }\n * @readonly\n */\n this.isSeeking = false\n\n /**\n * @type { boolean }\n * @readonly\n */\n this.isCanplay = false\n /**\n * @private\n * @readonly\n */\n this._useAutoplay = false\n /**\n * @description 记录起播需要seek的时间点\n * @type { number }\n * @private\n * @readonly\n */\n this.__startTime = -1\n /**\n * @type { number }\n */\n this.rotateDeg = 0\n /**\n * Whether the player is focus\n * @type { boolean }\n * @readonly\n */\n this.isActive = false\n\n /**\n * Whether player is currently in fullscreen\n * @type { boolean }\n * @readonly\n */\n this.fullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.cssfullscreen = false\n /**\n * @type { boolean }\n * @readonly\n */\n this.isRotateFullscreen = false\n\n /**\n * fullscreenElement\n * @type { HTMLElement | null }\n * @readonly\n */\n this._fullscreenEl = null\n\n this.timeSegments = []\n\n /**\n * cssfullscreen target Element\n * @type { HTMLElement | null }\n * @readonly\n */\n this._cssfullscreenEl = null\n\n /**\n * @type { ?IDefinition }\n * @public\n */\n this.curDefinition = null\n /**\n * @private\n * @type { string }\n */\n this._orgCss = ''\n /**\n * @readonly\n * @type { number }\n */\n this._fullScreenOffset = null\n /**\n * @private\n * @type { number }\n */\n this._videoHeight = 0\n /**\n * @private\n * @type { number }\n */\n this._videoWidth = 0\n\n this.videoPos = {\n pi: 1, // 宽高比\n scale: 0,\n rotate: -1,\n x: 0,\n y: 0,\n h: -1, // 高度占比\n w: -1, // 宽度占比\n vy: 0, // 画面在y方向的偏移\n vx: 0 // 画面在x方向的偏移\n }\n\n this.sizeInfo = {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n\n /**\n * @private\n * @type { { t: number, acc:number, acc: number, loopAcc: number, [propName: string]: any;} }\n */\n this._accPlayed = {\n t: 0,\n acc: 0,\n loopAcc: 0\n }\n\n /**\n * @description 播放器时长、播放时间偏移信息\n */\n this._offsetInfo = {\n currentTime: -1,\n duration: 0\n }\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 控制栏和video不同布局的时候内部容器\n */\n this.innerContainer = null\n\n /**\n * @type { ?Controls }\n * @readonly\n * @description 控制栏插件\n */\n this.controls = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n */\n this.topBar = null\n\n /**\n * @type { null | HTMLElement }\n * @readonly\n * @description 当前播放器根节点\n */\n this.root = null\n\n this.__i18n = I18N.init(this._pluginInfoId)\n\n // android 6以下不支持自动播放\n if (\n Sniffer.os.isAndroid &&\n Sniffer.osVersion > 0 &&\n Sniffer.osVersion < 6\n ) {\n this.config.autoplay = false\n }\n\n /**\n * @readonly\n * @type {any}\n */\n this.database = new Database()\n\n /**\n * @readonly\n * @type { boolean }\n */\n this.isUserActive = false\n\n /**\n * @private\n * @description seek之后canplay回调函数定义\n * @type { Function | null }\n */\n this._onceSeekCanplay = null\n\n /**\n * @description 记录seek之前是否处于暂停状态\n * @type { number }\n * @private\n */\n this._isPauseBeforeSeek = 0\n\n /**\n * @description 内部状态记录\n * @type { {\n * isActiveLocked: boolean;\n * } }\n * @readonly\n */\n this.innerStates = {\n // 当前的active是否是锁定状态\n isActiveLocked: false\n }\n\n /**\n * @type {InstManager}\n */\n this.instManager = instManager\n const rootInit = this._initDOM()\n if (!rootInit) {\n console.error(\n new Error(\n `can't find the dom which id is ${this.config.id} or this.config.el does not exist`\n )\n )\n return\n }\n\n // Initialize curDefinition and url\n const { definition = {}, url } = this.config\n if (Array.isArray(definition?.list) && definition.list.length > 0) {\n let curDefinition = definition.list.find(\n (e) => e.definition && e.definition === definition.defaultDefinition\n )\n // 若未配置definition.defaultDefinition,默认将配置为definition.list[0].definition\n if (!curDefinition) {\n definition.defaultDefinition = definition.list[0].definition\n curDefinition = definition.list[0]\n }\n this.curDefinition = curDefinition\n\n // url为空的情况下 根据definition或playnext.urlList设置播放地址\n if (!url) {\n this.config.url = curDefinition.url\n }\n }\n\n this._bindEvents()\n this._registerPresets()\n this._registerPlugins()\n pluginsManager.onPluginsReady(this)\n\n // url为空的情况下 根据definition设置播放地址\n this.getInitDefinition()\n\n this.setState(STATES.READY)\n Util.setTimeout(this, () => {\n this.emit(Events.READY)\n }, 0)\n this.onReady?.()\n\n if (this.config.videoInit || this.config.autoplay) {\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n this.start()\n }\n }\n }\n\n /**\n * init control domElement\n * @private\n */\n _initDOM () {\n this.root = this.config.id ? document.getElementById(this.config.id) : null\n if (!this.root) {\n const el = this.config.el\n if (el && el.nodeType === 1) {\n this.root = el\n } else {\n this.emit(\n Events.ERROR,\n new Errors('use', this.config.vid, {\n line: 32,\n handle: 'Constructor',\n msg: 'container id can\\'t be empty'\n })\n )\n console.error('this.config.id or this.config.el can\\'t be empty')\n return false\n }\n }\n const ret = checkPlayerRoot(this.root)\n if (ret) {\n XG_DEBUG.logWarn(\n 'The is an Player instance already exists in this.root, destroy it and reinitialize'\n )\n ret.destroy()\n }\n this.root.setAttribute(PLATER_ID, this.playerId)\n this.media.setAttribute(PLATER_ID, this.playerId)\n\n instManager?.add(this)\n pluginsManager.init(this)\n this._initBaseDoms()\n\n if (this.config.controls) {\n const _root = this.config.controls.root || null\n const controls = pluginsManager.register(this, Controls, { root: _root })\n this.controls = controls\n }\n const device =\n this.config.isMobileSimulateMode === 'mobile' ? 'mobile' : Sniffer.device\n this.addClass(\n `${STATE_CLASS.DEFAULT} ${STATE_CLASS.INACTIVE} xgplayer-${device} ${\n this.config.controls ? '' : STATE_CLASS.NO_CONTROLS\n }`\n )\n if (this.config.autoplay) {\n this.addClass(STATE_CLASS.ENTER)\n } else {\n this.addClass(STATE_CLASS.NO_START)\n }\n if (this.config.fluid) {\n let { width, height } = this.config\n if (typeof width !== 'number' || typeof height !== 'number') {\n width = 600\n height = 337.5\n }\n const style = {\n width: '100%',\n height: '0',\n 'max-width': '100%',\n 'padding-top': `${(height * 100) / width}%`\n // position: 'relative',\n // top: '0',\n // left: '0'\n }\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n } else {\n ['width', 'height'].forEach((key) => {\n if (this.config[key]) {\n if (typeof this.config[key] !== 'number') {\n this.root.style[key] = this.config[key]\n } else {\n this.root.style[key] = `${this.config[key]}px`\n }\n }\n })\n }\n const { width, height, left, top } = this.root.getBoundingClientRect()\n this.sizeInfo.width = width\n this.sizeInfo.height = height\n this.sizeInfo.left = left\n this.sizeInfo.top = top\n return true\n }\n\n /**\n * @private\n */\n _initBaseDoms () {\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.topBar = null\n /**\n * @readonly\n * @type { HTMLElement |null }\n */\n this.leftBar = null\n /**\n * @readonly\n * @type { HTMLElement | null }\n */\n this.rightBar = null\n\n if (this.config.marginControls) {\n this.innerContainer = Util.createDom(\n 'xg-video-container',\n '',\n { 'data-index': -1 },\n 'xg-video-container'\n )\n this.root.appendChild(this.innerContainer)\n }\n }\n\n /**\n * @private\n */\n _bindEvents () {\n ['focus', 'blur'].forEach((item) => {\n this.on(item, this['on' + item.charAt(0).toUpperCase() + item.slice(1)])\n })\n\n FULLSCREEN_EVENTS.forEach((item) => {\n document && document.addEventListener(item, this.onFullscreenChange)\n })\n\n if (Sniffer.os.isIos) {\n this.media.addEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.addEventListener( 'webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n this.once(Events.LOADED_DATA, this.resize)\n\n this.playFunc = () => {\n if (!this.config.closeFocusVideoFocus) {\n this.media.focus()\n }\n }\n this.once(Events.PLAY, this.playFunc)\n }\n\n /**\n * @private\n */\n _unbindEvents () {\n this.root.removeEventListener('mousemove', this.mousemoveFunc)\n FULLSCREEN_EVENTS.forEach((item) => {\n document.removeEventListener(item, this.onFullscreenChange)\n })\n this.playFunc && this.off(Events.PLAY, this.playFunc)\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.media.removeEventListener( 'webkitbeginfullscreen', this._onWebkitbeginfullscreen)\n this.media.removeEventListener('webkitendfullscreen', this._onWebkitendfullscreen)\n }\n\n _clearUserTimer () {\n if (!this.userTimer) {\n return\n }\n Util.clearTimeout(this, this.userTimer)\n this.userTimer = null\n }\n\n /**\n * @param { any } [url]\n * @param { { playSessionId?: number } } [options]\n * @returns\n */\n _startInit (url, options = {}) {\n if (!this.media) {\n return\n }\n if (\n !url ||\n url === '' ||\n (Util.typeOf(url) === 'Array' && url.length === 0)\n ) {\n url = ''\n this.emit(Events.URL_NULL)\n XG_DEBUG.logWarn(\n 'config.url is null, please get url and run player._startInit(url)'\n )\n if (this.config.nullUrlStart) {\n return\n }\n }\n\n if (Util.isNotNull(options.playSessionId)) {\n // PlaySessionId, used to identify a single play session,\n // for internal use by the player\n this._playSessionId = options.playSessionId\n }\n\n if (this.handleSource) {\n this._detachSourceEvents(this.media)\n if (Util.typeOf(url) === 'Array' && url.length > 0) {\n this._attachSourceEvents(this.media, url)\n } else if (!this.media.src || this.media.src !== url) {\n this.media.src = url\n } else if (!url) {\n this.media.removeAttribute('src')\n }\n }\n\n if (Util.typeOf(this.config.volume) === 'Number') {\n this.volume = this.config.volume\n }\n\n const _root = this.innerContainer ? this.innerContainer : this.root\n if (this.media instanceof window.Element && !_root.contains(this.media)) {\n _root.insertBefore(this.media, _root.firstChild)\n }\n\n const { readyState } = this.media\n XG_DEBUG.logInfo('_startInit readyState', readyState)\n if (this.config.autoplay) {\n !Util.isMSE(this.media) && this.load();\n // ios端无法自动播放的场景下,不调用play不会触发canplay loadeddata等事件\n (Sniffer.os.isIpad || Sniffer.os.isPhone) && this.mediaPlay()\n }\n\n const { startTime } = this.config\n this.__startTime = startTime > 0 ? startTime : -1\n this.config.startTime = 0\n if (readyState >= 2 && this.duration > 0) {\n this.canPlayFunc()\n } else {\n this.on(Events.CANPLAY, this.canPlayFunc)\n }\n if (!this.hasStart || this.state < STATES.ATTACHED) {\n pluginsManager.afterInit(this)\n }\n this.hasStart = true\n this.setState(STATES.ATTACHED)\n Util.setTimeout(this, () => {\n this.emit(Events.COMPLETE)\n }, 0)\n }\n\n /**\n * @description 注册组件 组件列表config.plugins\n * @param { {boolean} } [isInit] 是否是首次初始化\n * @private\n */\n _registerPlugins (isInit = true) {\n /**\n * @private\n */\n this._loadingPlugins = []\n const ignores = this.config.ignores || []\n const plugins = this.config.plugins || []\n const i18n = this.config.i18n || []\n isInit && I18N.extend(i18n, this.__i18n)\n const ignoresStr = ignores.join('||').toLowerCase().split('||')\n const cuPlugins = this.plugins\n plugins.forEach((plugin) => {\n try {\n const pluginName = plugin.plugin\n ? plugin.plugin.pluginName\n : plugin.pluginName\n // 在ignores中的不做组装\n if (pluginName && ignoresStr.indexOf(pluginName.toLowerCase()) > -1) {\n return null\n }\n\n if (!isInit && cuPlugins[pluginName.toLowerCase()]) {\n return\n }\n\n if (plugin.lazy && plugin.loader) {\n const loadingPlugin = pluginsManager.lazyRegister(this, plugin)\n if (plugin.forceBeforeInit) {\n loadingPlugin\n .then(() => {\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n .catch((e) => {\n XG_DEBUG.logError('_registerPlugins:loadingPlugin', e)\n this._loadingPlugins.splice(\n this._loadingPlugins.indexOf(loadingPlugin),\n 1\n )\n })\n this._loadingPlugins.push(loadingPlugin)\n }\n\n return\n }\n return this.registerPlugin(plugin)\n } catch (err) {\n XG_DEBUG.logError('_registerPlugins:', err)\n // return\n }\n })\n }\n\n /**\n * @private\n */\n _registerPresets () {\n this.config.presets.forEach((preset) => {\n usePreset(this, preset)\n })\n }\n\n /**\n * @private\n * @param { string } position ]\n */\n _getRootByPosition (position) {\n let _root = null\n switch (position) {\n case POSITIONS.ROOT_RIGHT:\n if (!this.rightBar) {\n this.rightBar = Util.createPositionBar('xg-right-bar', this.root)\n }\n _root = this.rightBar\n break\n case POSITIONS.ROOT_LEFT:\n if (!this.leftBar) {\n this.leftBar = Util.createPositionBar('xg-left-bar', this.root)\n }\n _root = this.leftBar\n break\n case POSITIONS.ROOT_TOP:\n if (!this.topBar) {\n this.topBar = Util.createPositionBar('xg-top-bar', this.root)\n if (this.config.topBarAutoHide) {\n Util.addClass(this.topBar, STATE_CLASS.TOP_BAR_AUTOHIDE)\n }\n }\n _root = this.topBar\n break\n default:\n _root = this.innerContainer || this.root\n break\n }\n return _root\n }\n\n /**\n *\n * @param { {plugin: function, options:object} | function } plugin\n * @param { {[propName: string]: any;} } [config]\n * @returns { any } plugin\n */\n registerPlugin (plugin, config) {\n const _retPlugin = pluginsManager.formatPluginInfo(plugin, config)\n const { PLUFGIN, options } = _retPlugin\n\n // 如果当前配置plugins中不存在该组件, 则将其push\n const { plugins } = this.config\n const exits = pluginsManager.checkPluginIfExits(PLUFGIN.pluginName, plugins)\n !exits && plugins.push(PLUFGIN)\n\n // 获取配置的position或者root\n const _pConfig = pluginsManager.getRootByConfig(PLUFGIN.pluginName, this.config)\n _pConfig.root && (options.root = _pConfig.root)\n _pConfig.position && (options.position = _pConfig.position)\n\n const position = options.position\n ? options.position\n : (options.config && options.config.position) ||\n (PLUFGIN.defaultConfig && PLUFGIN.defaultConfig.position)\n if (\n !options.root &&\n typeof position === 'string' &&\n position.indexOf('controls') > -1\n ) {\n return this.controls?.registerPlugin(PLUFGIN, options, PLUFGIN.pluginName)\n }\n if (!options.root) {\n options.root = this._getRootByPosition(position)\n }\n return pluginsManager.register(this, PLUFGIN, options)\n }\n\n /**\n *\n * @param { any } plugin\n */\n deregister (plugin) {\n if (typeof plugin === 'string') {\n pluginsManager.unRegister(this, plugin)\n } else if (plugin instanceof BasePlugin) {\n pluginsManager.unRegister(this, plugin.pluginName)\n }\n }\n\n /**\n *\n * @param { any } plugin\n * @param { boolean } removedFromConfig\n */\n unRegisterPlugin (plugin, removedFromConfig = false) {\n this.deregister(plugin)\n if (removedFromConfig) {\n this.removePluginFromConfig(plugin)\n }\n }\n\n removePluginFromConfig (plugin) {\n let pluginName\n if (typeof plugin === 'string') {\n pluginName = plugin\n } else if (plugin instanceof BasePlugin) {\n pluginName = plugin.pluginName\n }\n if (!pluginName) {\n return\n }\n for (let i = this.config.plugins.length - 1; i > -1; i--) {\n const plugin = this.config.plugins[i]\n if (plugin.pluginName.toLowerCase() === pluginName.toLowerCase()) {\n this.config.plugins.splice(i, 1)\n break\n }\n }\n }\n\n /**\n * 当前播放器挂载的插件实例列表\n * @type { {[propName: string]: any | null } }\n */\n get plugins () {\n return pluginsManager.getPlugins(this)\n }\n\n /**\n * get a plugin instance\n * @param { string } pluginName\n * @return { null | any } plugin\n */\n getPlugin (pluginName) {\n const plugin = pluginsManager.findPlugin(this, pluginName)\n return plugin && plugin.pluginName ? plugin : null\n }\n\n /**\n *\n * @param { string } className\n */\n addClass (className) {\n if (!this.root) {\n return\n }\n if (!Util.hasClass(this.root, className)) {\n Util.addClass(this.root, className)\n }\n }\n\n /**\n *\n * @param { string } className\n * @returns\n */\n removeClass (className) {\n if (!this.root) {\n return\n }\n Util.removeClass(this.root, className)\n }\n\n /**\n *\n * @param { string } className\n * @returns { boolean } has\n */\n hasClass (className) {\n if (!this.root) {\n return\n }\n return Util.hasClass(this.root, className)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n setAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.setAttribute(key, value)\n }\n\n /**\n *\n * @param { string } key\n * @param { any } value\n * @returns void\n */\n removeAttribute (key, value) {\n if (!this.root) {\n return\n }\n this.root.removeAttribute(key, value)\n }\n\n /**\n *\n * @param { any } [url]\n * @returns { Promise<void> | void }\n * @description 启动播放器,start一般都是播放器内部隐式调用,主要功能是将video添加到DOM\n */\n start (url) {\n // 已经开始初始化播放了 则直接调用play\n if (this.state > STATES.ATTACHING) {\n return\n }\n\n const playSessionId = this._playSessionId\n if (Util.isNotNull(playSessionId)) {\n this._playSessionId = undefined\n }\n\n if (!url && !this.config.url) {\n this.getInitDefinition()\n }\n this.hasStart = true\n this.setState(STATES.ATTACHING)\n\n this._registerPlugins(false)\n return pluginsManager\n .beforeInit(this)\n .then(() => {\n // this.config为空即已经销毁,不再执行后面的异步流程\n if (!this.config) {\n return\n }\n if (!url) {\n url = this.url || this.config.url\n }\n const _furl = this.preProcessUrl(url)\n const ret = this._startInit(_furl.url, { playSessionId })\n return ret\n })\n .catch((e) => {\n e.fileName = 'player'\n e.lineNumber = '236'\n XG_DEBUG.logError('start:beforeInit:', e)\n throw e\n })\n }\n\n /**\n * @param { string | object } url\n * @param { SwitchUrlOptions } [options]\n * @returns { Promise | null } 执行结果\n */\n switchURL (url, options) {\n let _src = url\n if (Util.typeOf(url) === 'Object') {\n _src = url.url\n }\n _src = this.preProcessUrl(_src).url\n const curTime = this.currentTime\n this.__startTime = curTime\n const isPaused = this.paused && !this.isError\n this.src = _src\n return new Promise((resolve, reject) => {\n const _error = (e) => {\n this.off('timeupdate', _canplay)\n this.off('canplay', _canplay)\n reject(e)\n }\n const _canplay = () => {\n this._seekToStartTime()\n if (isPaused) {\n this.pause()\n }\n this.off('error', _error)\n resolve(true)\n }\n this.once('error', _error)\n if (!_src){\n this.errorHandler('error', {code: 6, message: 'empty_src'})\n return\n }\n if (Sniffer.os.isAndroid) {\n this.once('timeupdate', _canplay)\n } else {\n this.once('canplay', _canplay)\n }\n this.play()\n })\n }\n\n /**\n * @description call play without play hook\n * @deprecated this api renamed to mediaPlay, you can call it as player.mediaPlay()\n */\n videoPlay () {\n this.mediaPlay()\n }\n\n /**\n * @description call play without play hook\n */\n mediaPlay () {\n if (!this.hasStart && this.state < STATES.ATTACHED) {\n this.removeClass(STATE_CLASS.NO_START)\n this.addClass(STATE_CLASS.ENTER)\n this.start()\n this._useAutoplay = true\n return\n }\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n !this.isCanplay && this.addClass(STATE_CLASS.ENTER)\n }\n const playPromise = super.play()\n if (playPromise !== undefined && playPromise && playPromise.then) {\n playPromise\n .then(() => {\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.addClass(STATE_CLASS.PLAYING)\n if (this.state < STATES.RUNNING) {\n XG_DEBUG.logInfo('>>>>playPromise.then')\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n })\n .catch((e) => {\n XG_DEBUG.logWarn('>>>>playPromise.catch', e.name)\n if (this.media && this.media.error) {\n this.onError()\n // this.errorHandler('error')\n this.removeClass(STATE_CLASS.ENTER)\n // this.setState(STATES.ERROR)\n return\n }\n // 避免AUTOPLAY_PREVENTED先于playing和play触发\n if (e.name === 'NotAllowedError') {\n /**\n * @private\n */\n this._errorTimer = Util.setTimeout(\n this,\n () => {\n this._errorTimer = null\n this.emit(Events.AUTOPLAY_PREVENTED)\n this.addClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.ENTER)\n this.pause()\n this.setState(STATES.NOTALLOW)\n },\n 0\n )\n }\n })\n } else {\n XG_DEBUG.logWarn('video.play not return promise')\n if (this.state < STATES.RUNNING) {\n this.setState(STATES.RUNNING)\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.addClass(STATE_CLASS.PLAYING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n }\n return playPromise\n }\n\n /**\n * @description call play without pause hook\n */\n mediaPause () {\n super.pause()\n }\n\n /**\n * @description call play without pause hook\n * @deprecated this api renamed to mediaPause, you can call it as player.mediaPause()\n */\n videoPause () {\n super.pause()\n }\n\n play () {\n this.removeClass(STATE_CLASS.PAUSED)\n return runHooks(this, 'play', () => {\n return this.mediaPlay()\n })\n }\n\n pause () {\n runHooks(this, 'pause', () => {\n super.pause()\n })\n }\n\n /**\n *\n * @param { number } time\n * @param { 'play' | 'pause' | 'auto' } [status]\n * @returns\n */\n seek (time, status) {\n if (!this.media || Number.isNaN(Number(time)) || !this.hasStart) {\n return\n }\n const { isSeekedPlay, seekedStatus } = this.config\n const _status = status || (isSeekedPlay ? 'play' : seekedStatus)\n time = time < 0 ? 0 : time > this.duration ? parseInt(this.duration, 10) : time\n\n !this._isPauseBeforeSeek && (this._isPauseBeforeSeek = this.paused ? 2 : 1)\n\n this._onceSeekCanplay && this.off(Events.SEEKED, this._onceSeekCanplay)\n\n this._onceSeekCanplay = () => {\n // const { seekedStatus } = this.config\n this.removeClass(STATE_CLASS.ENTER)\n this.isSeeking = false\n switch (_status) {\n case 'play':\n this.play()\n break\n case 'pause':\n this.pause()\n break\n default:\n this._isPauseBeforeSeek > 1 || this.paused ? this.pause() : this.play()\n }\n this._isPauseBeforeSeek = 0\n this._onceSeekCanplay = null\n }\n\n this.once(Events.SEEKED, this._onceSeekCanplay)\n if (this.state < STATES.RUNNING) {\n this.removeClass(STATE_CLASS.NO_START)\n this.currentTime = time\n // 未起播状态不论希望保持什么状态,都要触发一次play, 避免ios下起播异常问题\n this.play()\n } else {\n this.currentTime = time\n }\n }\n\n getInitDefinition () {\n // url为空的情况下 根据definition设置播放地址\n const { definition, url } = this.config\n if (\n !url &&\n definition &&\n definition.list &&\n definition.list.length > 0 &&\n definition.defaultDefinition\n ) {\n definition.list.map((item) => {\n if (item.definition === definition.defaultDefinition) {\n this.config.url = item.url\n this.curDefinition = item\n }\n })\n }\n }\n\n /**\n * @typedef { import('./defaultConfig').IDefinition } definition\n */\n /**\n * @description change the definition of the current playback\n * @param { definition } to\n * @param { definition } [from]\n */\n changeDefinition (to, from) {\n const { definition } = this.config\n\n if (Array.isArray(definition?.list)) {\n definition.list.forEach((item) => {\n if (to?.definition === item.definition) {\n this.curDefinition = item\n }\n })\n }\n\n if (to?.bitrate && typeof to.bitrate !== 'number') {\n to.bitrate = parseInt(to.bitrate, 10) || 0\n }\n\n this.emit(Events.DEFINITION_CHANGE, { from, to })\n if (!this.hasStart) {\n this.config.url = to.url\n return\n }\n const ret = this.switchURL(to.url, {\n seamless: definition.seamless !== false\n && typeof MediaSource !== 'undefined'\n && typeof MediaSource.isTypeSupported === 'function',\n ...to\n })\n if (ret && ret.then) {\n ret.then(() => {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n })\n } else {\n this.emit(Events.AFTER_DEFINITION_CHANGE, { from, to })\n }\n }\n\n reload () {\n this.load()\n /**\n * @private\n */\n this.reloadFunc = function () {\n this.play()\n }\n this.once(Events.LOADED_DATA, this.reloadFunc)\n }\n\n resetState () {\n const {\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n } = STATE_CLASS\n const clsList = [\n NOT_ALLOW_AUTOPLAY,\n PLAYING,\n NO_START,\n PAUSED,\n REPLAY,\n ENTER,\n ENDED,\n ERROR,\n LOADING\n ]\n this.hasStart = false\n this.isError = false\n this._useAutoplay = false\n this.mediaPause()\n this._accPlayed.acc = 0\n this._accPlayed.t = 0\n this._accPlayed.loopAcc = 0\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n this.addClass(STATE_CLASS.NO_START)\n this.emit(Events.RESET)\n }\n\n /**\n * 重置播放实例\n * @param { Array<string> } unregisterPlugins 重置的时候需要卸载重新初始化的插件列表\n * @param { boolean } [isResetConfig] 是否需要重置配置列表\n * @returns\n */\n reset (unregisterPlugins = [], isResetConfig) {\n this.resetState()\n const { plugins } = this\n\n if (!plugins) {\n return\n }\n\n unregisterPlugins.map((pn) => {\n this.deregister(pn)\n })\n\n if (isResetConfig) {\n const de = getDefaultConfig()\n Object.keys(this.config).forEach((k) => {\n if (\n this.config[k] !== 'undefined' &&\n (k === 'plugins' || k === 'presets' || k === 'el' || k === 'id')\n ) {\n this.config[k] = de[k]\n }\n })\n }\n }\n\n /**\n * @description destroy the player instance\n * @returns\n */\n destroy () {\n const { innerContainer, root, media } = this\n if (!root || !media) {\n return\n }\n this.hasStart = false\n this._useAutoplay = false\n root.removeAttribute(PLATER_ID)\n media.removeAttribute(PLATER_ID)\n this.updateAcc('destroy')\n this._unbindEvents()\n this._detachSourceEvents(this.media)\n Util.clearAllTimers(this)\n this.emit(Events.DESTROY)\n instManager?.remove(this)\n pluginsManager.destroy(this)\n delHooksDescriptor(this)\n super.destroy()\n // 退出全屏\n if (this.fullscreen && this._fullscreenEl === this.root) {\n this.exitFullscreen()\n }\n\n if (innerContainer) {\n const _c = innerContainer.children\n for (let i = 0; i < _c.length; i++) {\n innerContainer.removeChild(_c[i])\n }\n }\n !innerContainer &&\n media instanceof window.Node &&\n root.contains(media) && !this.config.remainMediaAfterDestroy &&\n root.removeChild(media);\n ['topBar', 'leftBar', 'rightBar', 'innerContainer'].map((item) => {\n this[item] && root.removeChild(this[item])\n this[item] = null\n })\n const cList = root.className.split(' ')\n if (cList.length > 0) {\n root.className = cList\n .filter((name) => name.indexOf('xgplayer') < 0)\n .join(' ')\n } else {\n root.className = ''\n }\n this.removeAttribute('data-xgfill');\n\n [\n 'isSeeking',\n 'isCanplay',\n 'isActive',\n 'cssfullscreen',\n 'fullscreen'\n ].forEach((key) => {\n this[key] = false\n })\n }\n\n replay () {\n this.removeClass(STATE_CLASS.ENDED)\n this.currentTime = 0\n this.isSeeking = false\n runHooks(this, 'replay', () => {\n this.once(Events.SEEKED, () => {\n const playPromise = this.mediaPlay()\n if (playPromise && playPromise.catch) {\n playPromise.catch(err => {\n console.log(err)\n })\n }\n })\n this.emit(Events.REPLAY)\n this.onPlay()\n })\n }\n\n retry () {\n this.removeClass(STATE_CLASS.ERROR)\n this.addClass(STATE_CLASS.LOADING)\n runHooks(this, 'retry', () => {\n const cur = this.currentTime\n const { url } = this.config\n const _srcRet = !Util.isMSE(this.media) ? this.preProcessUrl(url) : { url }\n this.src = _srcRet.url\n !this.config.isLive && (this.currentTime = cur)\n this.once(Events.CANPLAY, () => {\n this.mediaPlay()\n })\n })\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n changeFullStyle (root, el, rootClass, pClassName) {\n if (!root) {\n return\n }\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (!this._orgCss) {\n this._orgCss = Util.filterStyleFromText(root)\n }\n Util.addClass(root, rootClass)\n if (el && el !== root && !this._orgPCss) {\n /**\n * @private\n */\n this._orgPCss = Util.filterStyleFromText(el)\n Util.addClass(el, pClassName)\n el.setAttribute(PLATER_ID, this.playerId)\n }\n }\n\n /**\n *\n * @param { HTMLElement } root\n * @param { HTMLElement } [el]\n * @param { string } [rootClass]\n * @param { string } [pClassName]\n */\n recoverFullStyle (root, el, rootClass, pClassName) {\n if (!pClassName) {\n pClassName = STATE_CLASS.PARENT_FULLSCREEN\n }\n if (this._orgCss) {\n Util.setStyleFromCsstext(root, this._orgCss)\n this._orgCss = ''\n }\n Util.removeClass(root, rootClass)\n if (el && el !== root && this._orgPCss) {\n Util.setStyleFromCsstext(el, this._orgPCss)\n this._orgPCss = ''\n Util.removeClass(el, pClassName)\n el.removeAttribute(PLATER_ID)\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n getFullscreen (el = this.config.fullscreenTarget) {\n const { root, media } = this\n if (el === 'video' || el === 'media') {\n el = this[el]\n }\n if (!el) {\n el = root\n }\n this._fullScreenOffset = {\n top: Util.scrollTop(),\n left: Util.scrollLeft()\n }\n\n this._fullscreenEl = el\n /**\n * @private\n */\n this._fullActionFrom = 'get'\n const fullEl = Util.getFullScreenEl()\n if (fullEl === this._fullscreenEl) {\n this.onFullscreenChange()\n return Promise.resolve()\n }\n try {\n for (let i = 0; i < GET_FULLSCREEN_API.length; i++) {\n const key = GET_FULLSCREEN_API[i]\n if (el[key]) {\n const ret =\n key === 'webkitRequestFullscreen'\n ? el.webkitRequestFullscreen(window.Element.ALLOW_KEYBOARD_INPUT)\n : el[key]()\n if (ret && ret.then) {\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media.fullscreenEnabled || media.webkitSupportsFullscreen) {\n media.webkitEnterFullscreen()\n return Promise.resolve()\n }\n return Promise.reject(new Error('call getFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call getFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns { Promise<void> }\n */\n exitFullscreen (el) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n }\n if (!this._fullscreenEl && !Util.getFullScreenEl()) {\n return\n }\n const { root, media } = this\n if (!el) {\n el = root\n }\n this._fullActionFrom = 'exit'\n try {\n for (let i = 0; i < EXIT_FULLSCREEN_API.length; i++) {\n const key = EXIT_FULLSCREEN_API[i]\n if (document[key]) {\n const ret = document[key]()\n if (ret && ret.then) {\n ret.catch(() => {})\n return ret\n } else {\n return Promise.resolve()\n }\n }\n }\n if (media && media.webkitSupportsFullscreen) {\n const ret = media.webkitExitFullScreen()\n if(ret && ret.catch){\n ret.catch(() => {})\n }\n return Promise.resolve()\n }\n return Promise.reject(new Error('call exitFullscreen fail'))\n } catch (err) {\n return Promise.reject(new Error('call exitFullscreen fail'))\n }\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n getCssFullscreen (el = this.config.fullscreenTarget) {\n if (this.isRotateFullscreen) {\n this.exitRotateFullscreen()\n } else if (this.fullscreen) {\n this.exitFullscreen()\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n this.changeFullStyle(this.root, el, _class)\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.fullscreen = true\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n this._cssfullscreenEl = el\n this.cssfullscreen = true\n this.emit(Events.CSS_FULLSCREEN_CHANGE, true)\n }\n\n /**\n * @param { HTMLElement } [el]\n * @returns\n */\n exitCssFullscreen () {\n const _class = this._cssfullscreenEl\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.CSS_FULLSCREEN}`\n : STATE_CLASS.CSS_FULLSCREEN\n if (!this.fullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n } else {\n const { fullscreen = {} } = this.config\n const useCssFullscreen =\n fullscreen.useCssFullscreen === true ||\n (typeof fullscreen.useCssFullscreen === 'function' &&\n fullscreen.useCssFullscreen())\n if (useCssFullscreen) {\n this.recoverFullStyle(this.root, this._cssfullscreenEl, _class)\n this.fullscreen = false\n this.emit(Events.FULLSCREEN_CHANGE, false)\n } else {\n this.removeClass(_class)\n }\n }\n this._cssfullscreenEl = null\n this.cssfullscreen = false\n this.emit(Events.CSS_FULLSCREEN_CHANGE, false)\n }\n\n /**\n * 进入旋转全屏\n * @param { HTMLElement } [el]\n */\n getRotateFullscreen (el = this.config.fullscreenTarget) {\n if (this.cssfullscreen) {\n this.exitCssFullscreen(el)\n }\n const _class = el\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this._fullscreenEl = el || this.root\n this.changeFullStyle(\n this.root,\n el,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = true\n this.fullscreen = true\n this.setRotateDeg(90)\n this._rootStyle = this.root.getAttribute('style')\n const isRotate90 = Math.abs(window.orientation) === 90 || Math.abs(screen.orientation.angle) === 90\n // 如果已经是横屏状态,则取innerWidth,否则取innerHeight\n this.root.style.width = isRotate90 ? `${window.innerWidth}px` : `${window.innerHeight}px`\n this.emit(Events.FULLSCREEN_CHANGE, true)\n }\n\n /**\n * 退出旋转全屏\n * @param { HTMLElement } [el]\n */\n exitRotateFullscreen (el) {\n const _class =\n this._fullscreenEl !== this.root\n ? `${STATE_CLASS.INNER_FULLSCREEN} ${STATE_CLASS.ROTATE_FULLSCREEN}`\n : STATE_CLASS.ROTATE_FULLSCREEN\n this.recoverFullStyle(\n this.root,\n this._fullscreenEl,\n _class,\n STATE_CLASS.PARENT_ROTATE_FULLSCREEN\n )\n this.isRotateFullscreen = false\n this.fullscreen = false\n this.setRotateDeg(0)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n if (this._rootStyle) {\n this.root.style.style = this._rootStyle\n this._rootStyle = false\n }\n }\n\n setRotateDeg (deg) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.rotateDeg = 0\n } else {\n this.rotateDeg = deg\n }\n }\n\n /**\n * @description 播放器焦点状态,控制栏显示\n * @param { {\n * autoHide?: boolean, // 是否可以自动隐藏\n * delay?: number // 自动隐藏的延迟时间, ms, 不传默认使用3000ms\n * isLock?: boolean // 是否锁定, 锁定之后自动呼出和blur调用都不生效, 默认值false\n * } } [data]\n */\n focus (\n data = {\n autoHide: !this.config.closeDelayBlur,\n delay: this.config.inactive\n }\n ) {\n if (this.isActive) {\n this.onFocus(data)\n return\n }\n this.emit(Events.PLAYER_FOCUS, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @description 取消播放器当前焦点状态\n * @param { { ignorePaused?: boolean } } [data]\n */\n blur (data = { ignorePaused: false }) {\n if (!this.isActive) {\n this.onBlur(data)\n return\n }\n this._clearUserTimer()\n this.emit(Events.PLAYER_BLUR, {\n paused: this.paused,\n ended: this.ended,\n ...data\n })\n }\n\n /**\n * @protected\n * @param { { autoHide?: boolean, delay?: number, isLock?: boolean } } [data]\n * @returns\n */\n onFocus (data = { autoHide: true, delay: 3000 }) {\n const { innerStates } = this\n this.isActive = true\n this.removeClass(STATE_CLASS.INACTIVE)\n this._clearUserTimer()\n if (data.isLock !== undefined) {\n innerStates.isActiveLocked = data.isLock\n }\n if (data.autoHide === false || data.isLock === true || innerStates.isActiveLocked) {\n this._clearUserTimer()\n return\n }\n const time = data && data.delay ? data.delay : this.config.inactive\n this.userTimer = Util.setTimeout(this, () => {\n this.userTimer = null\n this.blur()\n }, time)\n }\n\n /**\n * @protected\n * @param {{ ignorePaused?: boolean }} [data]\n * @returns\n */\n onBlur ({ ignorePaused = false } = {}) {\n if (this.innerStates.isActiveLocked) {\n return\n }\n const { closePauseVideoFocus } = this.config\n this.isActive = false\n if (ignorePaused || closePauseVideoFocus || (!this.paused && !this.ended)) {\n this.addClass(STATE_CLASS.INACTIVE)\n }\n }\n\n canPlayFunc = () => {\n if (!this.config) {\n return\n }\n const { autoplay, defaultPlaybackRate } = this.config\n\n XG_DEBUG.logInfo('player', 'canPlayFunc, startTime', this.__startTime)\n this._seekToStartTime()\n\n // 解决浏览器安装了一些倍速扩展插件的情况下,倍速设置失效问题\n this.playbackRate = defaultPlaybackRate;\n\n (autoplay || this._useAutoplay) && this.mediaPlay()\n this.off(Events.CANPLAY, this.canPlayFunc)\n this.removeClass(STATE_CLASS.ENTER)\n }\n\n /**\n *\n */\n onFullscreenChange = (event, isFullScreen) => {\n const delayResize = () => {\n Util.setTimeout(this, () => {\n this.resize()\n }, 100)\n }\n const fullEl = Util.getFullScreenEl()\n if (this._fullActionFrom) {\n this._fullActionFrom = ''\n } else {\n // 快捷键触发\n this.emit(Events.USER_ACTION, {\n eventType: 'system',\n action: 'switch_fullscreen',\n pluginName: 'player',\n currentTime: this.currentTime,\n duration: this.duration,\n props: [{\n prop: 'fullscreen',\n from: true,\n to: false\n }]\n })\n }\n const isVideo = checkIsCurrentVideo(fullEl, this.playerId, PLATER_ID)\n if (isFullScreen || (fullEl && (fullEl === this._fullscreenEl || isVideo))) {\n delayResize()\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = true\n // this.addClass(STATE_CLASS.FULLSCREEN)\n this.changeFullStyle(this.root, fullEl, STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, true, this._fullScreenOffset)\n if (this.cssfullscreen) {\n this.exitCssFullscreen()\n }\n } else if (this.fullscreen) {\n delayResize()\n const { _fullScreenOffset, config } = this\n if (config.needFullscreenScroll) {\n // 保证页面scroll的情况下退出全屏 页面回到原位置\n window.scrollTo(_fullScreenOffset.left, _fullScreenOffset.top)\n Util.setTimeout( this, () => {\n this.fullscreen = false\n this._fullScreenOffset = null\n }, 100)\n } else {\n // 保证页面scroll的情况下退出全屏 页面定位在播放器位置\n !this.config.closeFocusVideoFocus && this.media.focus()\n this.fullscreen = false\n this._fullScreenOffset = null\n }\n if (!this.cssfullscreen) {\n let el = this._fullscreenEl\n if (!el && (this.root.contains(event.target) || event.target === this.root)) {\n el = event.target\n }\n this.recoverFullStyle( this.root, el, STATE_CLASS.FULLSCREEN)\n } else {\n this.removeClass(STATE_CLASS.FULLSCREEN)\n }\n this._fullscreenEl = null\n // this.removeClass(STATE_CLASS.FULLSCREEN)\n this.emit(Events.FULLSCREEN_CHANGE, false)\n }\n }\n\n _onWebkitbeginfullscreen = (e) => {\n this._fullscreenEl = this.media\n this.onFullscreenChange(e, true)\n }\n\n _onWebkitendfullscreen = (e) => {\n this.onFullscreenChange(e, false)\n }\n\n onEmptied () {\n this.updateAcc('emptied')\n }\n\n /**\n * @protected\n */\n onCanplay () {\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.ERROR)\n this.removeClass(STATE_CLASS.LOADING)\n this.isCanplay = true\n this.waitTimer && Util.clearTimeout(this, this.waitTimer)\n }\n\n onLoadeddata () {\n this.isError = false\n this.isSeeking = false\n if (this.__startTime > 0) {\n if (this.duration > 0) {\n this._seekToStartTime()\n } else {\n // 在安卓原生video播放hls时,loadeddata触发时durationchange事件虽然已经触发过了但duration仍然为0,\n // 需要在下一次durationchange触发时再重新设置起播时间\n this.once(Events.DURATION_CHANGE, () => {\n this._seekToStartTime()\n })\n }\n }\n }\n\n onLoadstart () {\n this.removeClass(STATE_CLASS.ERROR)\n this.isCanplay = false\n }\n\n /**\n * @protected\n */\n onPlay () {\n if (this.state === STATES.ENDED) {\n this.setState(STATES.RUNNING)\n }\n this.removeClass(STATE_CLASS.PAUSED)\n this.ended && this.removeClass(STATE_CLASS.ENDED)\n !this.config.closePlayVideoFocus && this.focus()\n }\n\n /**\n * @protected\n */\n onPause () {\n this.addClass(STATE_CLASS.PAUSED)\n this.updateAcc('pause')\n if (!this.config.closePauseVideoFocus) {\n this._clearUserTimer()\n this.focus()\n }\n }\n\n /**\n * @protected\n */\n onEnded () {\n this.updateAcc('ended')\n this.addClass(STATE_CLASS.ENDED)\n this.setState(STATES.ENDED)\n // this.removeClass(STATE_CLASS.PLAYING)\n }\n\n /**\n * @protected\n */\n onError () {\n // this.setState(STATES.ERROR)\n this.isError = true\n this.updateAcc('error')\n this.removeClass(STATE_CLASS.NOT_ALLOW_AUTOPLAY)\n this.removeClass(STATE_CLASS.NO_START)\n this.removeClass(STATE_CLASS.ENTER)\n this.removeClass(STATE_CLASS.LOADING)\n this.addClass(STATE_CLASS.ERROR)\n }\n\n /**\n * @protected\n */\n onSeeking () {\n if (!this.isSeeking) {\n this.updateAcc('seeking')\n }\n this.isSeeking = true\n this.addClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onSeeked () {\n this.isSeeking = false\n // for ie,playing fired before waiting\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.removeClass(STATE_CLASS.LOADING)\n this.removeClass(STATE_CLASS.SEEKING)\n }\n\n /**\n * @protected\n */\n onWaiting () {\n if (this.waitTimer) {\n Util.clearTimeout(this, this.waitTimer)\n }\n this.updateAcc('waiting')\n this.waitTimer = Util.setTimeout(this, () => {\n this.addClass(STATE_CLASS.LOADING)\n this.emit(Events.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }, this.config.minWaitDelay)\n }\n\n /**\n * @protected\n */\n onPlaying () {\n this.isError = false\n const { NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING } = STATE_CLASS\n const clsList = [NO_START, PAUSED, ENDED, ERROR, REPLAY, LOADING]\n clsList.forEach((cls) => {\n this.removeClass(cls)\n })\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n /**\n * @protected\n */\n onTimeupdate () {\n !this._videoHeight && this.media.videoHeight && this.resize()\n if ((this.waitTimer || this.hasClass(STATE_CLASS.LOADING)) &&\n this.media.readyState > 2\n ) {\n this.removeClass(STATE_CLASS.LOADING)\n Util.clearTimeout(this, this.waitTimer)\n this.waitTimer = null\n }\n\n // 兼容safari在调整为静音之后未调用play自动起播问题\n if (!this.paused && this.state === STATES.NOTALLOW && this.duration) {\n this.setState(STATES.RUNNING)\n this.emit(Events.AUTOPLAY_STARTED)\n }\n\n if (!this._accPlayed.t && !this.paused && !this.ended) {\n this._accPlayed.t = new Date().getTime()\n }\n }\n\n onVolumechange () {\n Util.typeOf(this.config.volume) === 'Number' &&\n (this.config.volume = this.volume)\n }\n\n onRatechange () {\n this.config.defaultPlaybackRate = this.playbackRate\n }\n\n /**\n * 触发用户行为事件,第一个参数是Dom事件\n * @param { Event } event\n * @param { string } action\n * @param {[propName: string]: any; } [params]\n * @returns\n */\n emitUserAction (event, action, params) {\n if (!this.media || !action || !event) {\n return\n }\n const eventType =\n Util.typeOf(event) === 'String' ? event : event.type || ''\n\n // if (action === 'switch_play_pause') {\n // Util.typeOf(params.paused) === 'Undefined' && (params.paused = this.paused)\n // params.isFirstStart = !this.playing\n // }\n\n if (params.props && Util.typeOf(params.props) !== 'Array') {\n params.props = [params.props]\n }\n this.emit(Events.USER_ACTION, {\n eventType,\n action,\n // pluginName: this.pluginName,\n currentTime: this.currentTime,\n duration: this.duration,\n ended: this.ended,\n event,\n ...params\n })\n }\n\n updateAcc (endType) {\n if (this._accPlayed.t) {\n const _at = new Date().getTime() - this._accPlayed.t\n this._accPlayed.acc += _at\n this._accPlayed.t = 0\n if (endType === 'ended' || this.ended) {\n this._accPlayed.loopAcc = this._accPlayed.acc\n }\n }\n }\n\n /**\n * 目标时间点是否在buffer内\n * @param { number } time 时间点\n * @param options 判断阈值配置,可选的\n * @param options.startDiff 判断起始阈值,即该时间下距离buffer开始点超过阈值时才算作在buffer内,默认为0\n * @param options.endDiff 判断结束阈值,即该时间下距离buffer结束点超过阈值时才算作在buffer内,默认为0\n * @returns { boolean }\n */\n checkBuffer (\n time,\n options = {\n startDiff: 0,\n endDiff: 0\n }) {\n const { startDiff = 0, endDiff = 0 } = options || {}\n const buffered = this.media.buffered\n if (!buffered || buffered.length === 0 || !this.duration) {\n return true\n }\n const currentTime = time || this.media.currentTime || 0.2\n const len = buffered.length\n for (let i = 0; i < len; i++) {\n if (buffered.start(i) + startDiff <= currentTime && buffered.end(i) - endDiff > currentTime) {\n return true\n }\n }\n return false\n }\n\n resizePosition () {\n const { vy, vx, h, w } = this.videoPos\n let rotate = this.videoPos.rotate\n if (rotate < 0 && h < 0 && w < 0) {\n return\n }\n let _pi = this.videoPos._pi\n if (!_pi && this.media.videoHeight) {\n _pi = this.media.videoWidth / this.media.videoHeight * 100\n }\n if (!_pi) {\n return\n }\n this.videoPos.pi = _pi\n rotate = rotate < 0 ? 0 : rotate\n const _pos = {\n rotate\n }\n let offsetY = 0\n let offsetX = 0\n let scale = 1\n const _t = Math.abs(rotate / 90)\n const { root, innerContainer } = this\n const width = root.offsetWidth\n const height = innerContainer ? innerContainer.offsetHeight : root.offsetHeight\n const styles = {}\n let rHeight = height\n let rWidth = width\n\n if (_t % 2 === 0) {\n scale = h > 0 ? 100 / h : (w > 0 ? 100 / w : 1)\n _pos.scale = scale\n offsetY = vy > 0 ? (100 - h) / 2 - vy : 0\n _pos.y = _t === 2 ? 0 - offsetY : offsetY\n offsetX = vx > 0 ? (100 - w) / 2 - vx : 0\n _pos.x = _t === 2 ? 0 - offsetX : offsetX\n styles.width = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxWidth = ''\n styles.maxHeight = ''\n } else if (_t % 2 === 1) {\n rWidth = height\n rHeight = width\n const offset = height - width\n offsetX = -offset / 2 / rWidth * 100\n _pos.x = _t === 3 ? offsetX + vy / 2 : offsetX - vy / 2\n offsetY = offset / 2 / rHeight * 100\n _pos.y = _t === 3 ? offsetY + vx / 2 : offsetY - vx / 2\n _pos.scale = scale\n styles.width = `${rWidth}px`\n styles.maxWidth = `${rWidth}px`\n styles.height = `${rHeight}px`\n styles.maxHeight = `${rHeight}px`\n }\n const formStyle = Util.getTransformStyle(_pos, this.media.style.transform || this.media.style.webkitTransform)\n styles.transform = formStyle\n styles.webkitTransform = formStyle\n\n Object.keys(styles).map(key => {\n this.media.style[key] = styles[key]\n })\n }\n\n /**\n * @description position video/audio according to height ratio and y coordinate\n * @param { { h: number, y?: number, x?:number, w?:number} } pos\n * @returns\n */\n position (pos = { h: 0, y: 0, x: 0, w: 0 }) {\n if (!this.media || !pos || !pos.h) {\n return\n }\n const { videoPos } = this\n videoPos.h = pos.h * 100 || 0\n videoPos.w = pos.w * 100 || 0\n videoPos.vx = pos.x * 100 || 0\n videoPos.vy = pos.y * 100 || 0\n this.resizePosition()\n }\n\n /**\n * @description Update configuration parameters\n * @param { IPlayerOptions } config\n */\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map((key) => {\n if (key !== 'plugins') {\n this.config[key] = config[key]\n const plugin = this.plugins[key.toLowerCase()]\n if (plugin && Util.typeOf(plugin.setConfig) === 'Function') {\n plugin.setConfig(config[key])\n }\n }\n })\n }\n\n /**\n * @description play another video resource\n * @param { IPlayerOptions } config\n */\n playNext (config) {\n this.resetState()\n this.setConfig(config)\n this._currentTime = 0\n this._duration = 0\n runHooks(this, 'playnext', () => {\n this.start()\n this.emit(Events.PLAYNEXT, config)\n })\n }\n\n resize () {\n if (!this.media || !this.root) {\n return\n }\n const containerSize = this.root.getBoundingClientRect()\n this.sizeInfo.width = containerSize.width\n this.sizeInfo.height = containerSize.height\n this.sizeInfo.left = containerSize.left\n this.sizeInfo.top = containerSize.top\n const { videoWidth, videoHeight } = this.media\n const { fitVideoSize, videoFillMode } = this.config\n\n if (videoFillMode === 'fill' || videoFillMode === 'cover' || videoFillMode === 'contain') {\n this.setAttribute('data-xgfill', videoFillMode)\n }\n\n if (!videoHeight || !videoWidth) {\n return\n }\n this._videoHeight = videoHeight\n this._videoWidth = videoWidth\n const controlsHeight =\n this.controls && this.innerContainer\n ? this.controls.root.getBoundingClientRect().height\n : 0\n const width = containerSize.width\n const height = containerSize.height - controlsHeight\n const videoFit = parseInt((videoWidth / videoHeight) * 1000, 10)\n const fit = parseInt((width / height) * 1000, 10)\n let rWidth = width\n let rHeight = height\n const _style = {}\n if (\n (fitVideoSize === 'auto' && fit > videoFit) ||\n fitVideoSize === 'fixWidth'\n ) {\n rHeight = (width / videoFit) * 1000\n if (this.config.fluid) {\n _style.paddingTop = `${(rHeight * 100) / rWidth}%`\n } else {\n _style.height = `${rHeight + controlsHeight}px`\n }\n } else if (\n (fitVideoSize === 'auto' && fit < videoFit) ||\n fitVideoSize === 'fixHeight'\n ) {\n rWidth = (videoFit * height) / 1000\n _style.width = `${rWidth}px`\n }\n // 全屏不做行间css设置\n if (!this.fullscreen && !this.cssfullscreen) {\n Object.keys(_style).forEach((key) => {\n this.root.style[key] = _style[key]\n })\n }\n // video填充模式\n if (\n (videoFillMode === 'fillHeight' && fit < videoFit) ||\n (videoFillMode === 'fillWidth' && fit > videoFit)\n ) {\n this.setAttribute('data-xgfill', 'cover')\n }\n const data = {\n videoScale: videoFit,\n vWidth: rWidth,\n vHeight: rHeight,\n cWidth: rWidth,\n cHeight: rHeight + controlsHeight\n }\n this.resizePosition()\n this.emit(Events.VIDEO_RESIZE, data)\n }\n\n /**\n *\n * @param { number } left\n * @param { number } top\n * @returns\n */\n updateObjectPosition (left = 0, top = 0) {\n if (this.media.updateObjectPosition) {\n this.media.updateObjectPosition(left, top)\n return\n }\n this.media.style.objectPosition = `${left * 100}% ${top * 100}%`\n }\n\n /**\n * @protected\n * @param { number } newState\n */\n setState (newState) {\n XG_DEBUG.logInfo(\n 'setState',\n `state from:${STATE_ARRAY[this.state]} to:${STATE_ARRAY[newState]}`\n )\n this._state = newState\n }\n\n /**\n * @description url preprocessing\n * @param { IUrl } url\n * @param { {[propName: string]: any} } [ext]\n * @returns { url: IUrl, [propName: string]: any }\n * @public\n */\n preProcessUrl (url, ext) {\n const { preProcessUrl, preProcessUrlOptions } = this.config\n const processUrlOptions = Object.assign({}, preProcessUrlOptions, ext)\n return !Util.isBlob(url) && typeof preProcessUrl === 'function' ? preProcessUrl(url, processUrlOptions) : { url }\n }\n\n\n /**\n * @description 跳转至配置的起播时间点\n */\n _seekToStartTime () {\n if (this.__startTime > 0 && this.duration > 0) {\n this.currentTime = this.__startTime > this.duration ? this.duration : this.__startTime\n this.__startTime = -1\n }\n }\n\n /**\n * @type { number }\n */\n get state () {\n return this._state\n }\n\n /**\n * @type { boolean }\n */\n get isFullscreen () {\n return this.fullscreen\n }\n\n /**\n * @type { boolean }\n */\n get isCssfullScreen () {\n return this.cssfullscreen\n }\n\n /**\n * @type { boolean }\n * @description 是否开始播放\n */\n get hasStart () {\n return this._hasStart\n }\n\n set hasStart (bool) {\n if (typeof bool === 'boolean') {\n this._hasStart = bool\n if (bool === false) {\n this.setState(STATES.READY)\n }\n this.emit('hasstart')\n }\n }\n\n /**\n * @type { boolean }\n * @description 是否已经进入起播状态\n */\n get isPlaying () {\n return this._state === STATES.RUNNING || this._state === STATES.ENDED\n }\n\n set isPlaying (value) {\n if (value) {\n this.setState(STATES.RUNNING)\n } else {\n this._state >= STATES.RUNNING && (this.setState(STATES.ATTACHED))\n }\n }\n\n /**\n * @type { Array.<IDefinition> }\n */\n set definitionList (list) {\n const { definition } = this.config\n let curDef = null\n let targetDef = null\n\n definition.list = list\n this.emit('resourceReady', list)\n\n list.forEach((item) => {\n if (this.curDefinition?.definition === item.definition) {\n curDef = item\n }\n if (definition.defaultDefinition === item.definition) {\n targetDef = item\n }\n })\n if (!targetDef && list.length > 0) {\n targetDef = list[0]\n }\n curDef\n ? this.changeDefinition(curDef)\n : targetDef && this.changeDefinition(targetDef)\n }\n\n get definitionList () {\n if (!this.config || !this.config.definition) {\n return []\n }\n return this.config.definition.list || []\n }\n\n /**\n * @description VideoFrames infos\n * @type { {\n * total: number,\n * dropped: number,\n * corrupted: number,\n * droppedRate: number,\n * droppedDuration: number\n * } }\n */\n get videoFrameInfo () {\n const ret = {\n total: 0,\n dropped: 0,\n corrupted: 0,\n droppedRate: 0,\n droppedDuration: 0\n }\n if (!this.media || !this.media.getVideoPlaybackQuality) {\n return ret\n }\n const _quality = this.media.getVideoPlaybackQuality()\n ret.dropped = _quality.droppedVideoFrames || 0\n ret.total = _quality.totalVideoFrames || 0\n ret.corrupted = _quality.corruptedVideoFrames || 0\n if (ret.total > 0) {\n ret.droppedRate = (ret.dropped / ret.total) * 100\n ret.droppedDuration = parseInt(\n (this.cumulateTime / ret.total) * ret.dropped,\n 0\n )\n }\n return ret\n }\n\n /**\n * @type { string }\n */\n set lang (lang) {\n const result = I18N.langKeys.filter((key) => key === lang)\n if (result.length === 0 && lang !== 'zh') {\n console.error(\n `Sorry, set lang fail, because the language [${lang}] is not supported now, list of all supported languages is [${I18N.langKeys.join()}] `\n )\n return\n }\n this.config.lang = lang\n pluginsManager.setLang(lang, this)\n }\n\n get lang () {\n return this.config.lang\n }\n\n get i18n () {\n let _l = this.config.lang\n if (_l === 'zh') {\n _l = 'zh-cn'\n }\n return this.__i18n.lang[_l] || this.__i18n.lang.en\n }\n\n get i18nKeys () {\n return this.__i18n.textKeys || {}\n }\n\n /**\n * @type { string }\n */\n get version () {\n return version\n }\n\n /**\n * @type { number | string }\n */\n get playerId () {\n return this._pluginInfoId\n }\n\n /**\n * @type { any }\n */\n set url (url) {\n /**\n * @private\n */\n this.__url = url\n }\n\n get url () {\n return this.__url || this.config.url\n }\n\n /**\n * @type { string }\n */\n set poster (posterUrl) {\n this.plugins.poster && this.plugins.poster.update(posterUrl)\n }\n\n get poster () {\n return this.plugins.poster\n ? this.plugins.poster.config.poster\n : this.config.poster\n }\n\n get readyState () {\n return super.readyState\n }\n\n get error () {\n const key = super.error\n return this.i18n[key] || key\n }\n\n get networkState () {\n return super.networkState\n }\n\n /**\n * @type { boolean }\n */\n get fullscreenChanging () {\n return !(this._fullScreenOffset === null)\n }\n\n /**\n * 累计观看时长\n * @type { number }\n */\n get cumulateTime () {\n const { acc, t } = this._accPlayed\n return t ? new Date().getTime() - t + acc : acc\n }\n\n /**\n * @type { number }\n */\n get zoom () {\n return this.config.zoom\n }\n\n /**\n * @type { number }\n */\n set zoom (value) {\n this.config.zoom = value\n }\n\n /**\n * @type {number}\n * @description Media element rotation angle, Only multiples of 90 degrees are supported\n */\n set videoRotateDeg (val) {\n val = Util.convertDeg(val)\n if (val % 90 !== 0 || val === this.videoPos.rotate) {\n return\n }\n this.videoPos.rotate = val\n this.resizePosition()\n }\n\n get videoRotateDeg () {\n return this.videoPos.rotate\n }\n\n /**\n * @description 均衡下载速度,单位kb/s, 根据10条最新下载速度计算出来的加权值,如果没有测速能力则默认是0\n * @type { number }\n */\n set avgSpeed (val) {\n AVG_SPEED = val\n }\n\n get avgSpeed () {\n return AVG_SPEED\n }\n\n /**\n * @type { number }\n * 最新一次下载速度,单位kb/s, 如果没有测速能力则默认是0\n */\n set realTimeSpeed (val) {\n REAL_TIME_SPEED = val\n }\n\n get realTimeSpeed () {\n return REAL_TIME_SPEED\n }\n\n get offsetCurrentTime () {\n return this._offsetInfo.currentTime || 0\n }\n\n set offsetCurrentTime (val) {\n this._offsetInfo.currentTime = val\n }\n\n get offsetDuration () {\n return this._offsetInfo.duration || 0\n }\n\n set offsetDuration (val) {\n this._offsetInfo.duration = val || 0\n }\n /**\n * @param { string } hookName\n * @param { Function } handler\n * @param { {pre: Function| null , next: Function | null} } preset\n * @returns\n */\n hook (hookName, handler, preset = { pre: null, next: null }) {\n // eslint-disable-next-line no-return-assign\n return hook.call(this, ...arguments)\n }\n\n /**\n * @param {...any} args\n */\n runHooks (...args) {\n return runHooks.call(this, ...arguments)\n }\n\n /**\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns {boolean} isSuccess\n */\n useHooks (hookName, handler) {\n return useHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } hookName\n * @param { (player: any, ...args) => boolean | Promise<any> } handler\n * @returns\n */\n removeHooks (hookName, handler) {\n return removeHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n usePluginHooks (pluginName, hookName, handler, ...args) {\n return usePluginHooks.call(this, ...arguments)\n }\n\n /**\n *\n * @param { string } pluginName\n * @param { string } hookName\n * @param { (plugin: any, ...args) => boolean | Promise<any> } handler\n * @param {...any} args\n * @returns { boolean } isSuccess\n */\n removePluginHooks (pluginName, hookName, handler, ...args) {\n return removePluginHooks.call(this, ...arguments)\n }\n\n /**\n * 设置当前实例的用户激活态\n * @param { boolean } isActive\n * @param { boolean } [isMuted]\n */\n setUserActive (isActive, isMuted) {\n if (typeof isMuted === 'boolean' && isMuted !== this.muted) {\n this.addInnerOP('volumechange')\n if (Util.typeOf(isMuted) === Boolean) {\n /**\n * @type {boolean}\n */\n this.muted = isMuted\n }\n }\n instManager?.setActive(this.playerId, isActive)\n }\n\n /**\n * 当前浏览器是否支持hevc编码\n * @returns {boolean}\n */\n static isHevcSupported () {\n return Sniffer.isHevcSupported()\n }\n\n /**\n * 检测编码参数是否被当前浏览器支持\n * @doc https://developer.mozilla.org/en-US/docs/Web/API/MediaCapabilities/decodingInfo\n * @param {MediaDecodingConfiguration} info\n * @returns {MediaCapabilitiesDecodingInfo}\n */\n static probeConfigSupported (info) {\n return Sniffer.probeConfigSupported(info)\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static install (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n if (!Player.plugins[name]) {\n Player.plugins[name] = descriptor\n }\n }\n\n /**\n * @deprecated\n * 插件全部迁移完成再做删除\n */\n static use (name, descriptor) {\n if (!Player.plugins) {\n Player.plugins = {}\n }\n Player.plugins[name] = descriptor\n }\n\n static defaultPreset = null;\n\n /**\n * @description 自定义media构造函数\n */\n static XgVideoProxy = null;\n}\n\n// use the default instance manager.\nPlayer.instManager = InstManager.getInstance()\n\nexport {\n Player as default,\n Plugin,\n BasePlugin,\n Events,\n Errors,\n Sniffer,\n Util,\n STATE_CLASS,\n I18N\n}\n","export function xgIconTips (plugin, textKey, isShow) {\n try {\n return ` <div class=\"xg-tips ${isShow ? 'hide' : ' '}\" lang-key=\"${plugin.i18nKeys[textKey]}\">\n ${plugin.i18n[textKey]}\n </div>`\n } catch (e) {\n return '<div class=\"xg-tips hide\"></div>'\n }\n}","import Plugin from '../../plugin'\n\nexport default class Icon extends Plugin {\n afterCreate () {\n this.bind('mouseenter', this._onMouseenter)\n this.bind('mouseleave', this._onMouseLeave)\n if (this.config.disable) {\n this.disable()\n }\n }\n\n _onMouseenter = (e) => {\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n _onMouseLeave = (e) => {\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n destroy () {\n this.unbind('mouseenter', this._onMouseenter)\n this.unbind('mouseleave', this._onMouseLeave)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport CssFullSceenSvg from '../assets/requestCssFull.svg'\nimport ExitCssFullSceenSvg from '../assets/exitCssFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * target: null | HTMLElement,\n * [propName: string]: any\n * } } ICssConfig\n */\n\nexport default class CssFullScreen extends IconPlugin {\n static get pluginName () {\n return 'cssFullscreen'\n }\n\n /**\n * @type ICssConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 1,\n disable: false,\n target: null\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.cssFullscreen === 'boolean') {\n args.config.disable = !args.player.config.cssFullscreen\n }\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n\n if (this.config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n this.initIcons()\n this.on(Events.CSS_FULLSCREEN_CHANGE, (isCssfullScreen) => {\n this.animate(isCssfullScreen)\n })\n this.btnClick = this.btnClick.bind(this)\n this.handleCssFullscreen = this.hook('cssFullscreen_change', this.btnClick, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this.handleCssFullscreen)\n }\n\n initIcons () {\n const { icons } = this\n const contentIcon = this.find('.xgplayer-icon')\n contentIcon.appendChild(icons.cssFullscreen)\n contentIcon.appendChild(icons.exitCssFullscreen)\n }\n\n btnClick (e) {\n e.preventDefault()\n e.stopPropagation()\n const { isCssfullScreen } = this.player\n this.emitUserAction(e, 'switch_cssfullscreen', { cssfullscreen: isCssfullScreen })\n if (!isCssfullScreen) {\n this.player.getCssFullscreen()\n } else {\n this.player.exitCssFullscreen()\n }\n }\n\n animate (isFullScreen) {\n if (!this.root) {\n return\n }\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n this.switchTips(isFullScreen)\n }\n\n switchTips (isFullScreen) {\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n tipDom && this.changeLangTextKey(tipDom, isFullScreen ? i18nKeys.EXITCSSFULLSCREEN_TIPS : i18nKeys.CSSFULLSCREEN_TIPS)\n }\n\n registerIcons () {\n return {\n cssFullscreen: { icon: CssFullSceenSvg, class: 'xg-get-cssfull' },\n exitCssFullscreen: { icon: ExitCssFullSceenSvg, class: 'xg-exit-cssfull' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class='xgplayer-cssfullscreen'>\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'CSSFULLSCREEN_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import Plugin, { POSITIONS, Util } from '../../plugin'\nimport BackSVG from '../assets/back.svg'\n\nexport default class TopBackIcon extends Plugin {\n static get pluginName () {\n return 'topbackicon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT_TOP,\n index: 0\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.onClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n this.config.onClick(e)\n }\n\n this.bind(['click', 'touchend'], this.onClick)\n }\n\n registerIcons () {\n return {\n screenBack: { icon: BackSVG, class: 'xg-fullscreen-back' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild(this.root, icons.screenBack)\n }\n\n show () {\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n render () {\n return `<xg-icon class=\"xgplayer-back\">\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Sniffer, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport TopBackIcon from './backicon'\nimport FullScreenSvg from '../assets/requestFull.svg'\nimport ExitFullScreenSvg from '../assets/exitFull.svg'\nimport './index.scss'\n\n/**\n * @typedef { {\n * position?: string,\n * index?: number,\n * useCssFullscreen?: boolean,\n * rotateFullscreen?: boolean,\n * useScreenOrientation?: boolean,\n * lockOrientationType?: OrientationType,\n * switchCallback?: () => any,\n * target?: null | HTMLElement,\n * disable?: boolean,\n * needBackIcon?: boolean,\n * [propName: string]: any\n * } } IFullscreenConfig\n */\nexport default class Fullscreen extends IconPlugin {\n static get pluginName () {\n return 'fullscreen'\n }\n\n /**\n * @type IFullscreenConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 0,\n useCssFullscreen: false, // Whether to use the page full screen\n rotateFullscreen: false, // Whether to enable rotating full screen\n useScreenOrientation: false, // Whether to use ScreenOrientation lock after requestFullScreen if ScreenOrientation available\n lockOrientationType: 'landscape', // Whether to lock screen if video width is greater than height\n switchCallback: null, // Custom switch function\n target: null, // Trigger Dom element\n disable: false,\n needBackIcon: false // Whether to enable the return button in the upper left corner of the full screen exit\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config, playerConfig } = this\n if (config.disable) {\n return\n }\n\n if (config.target) {\n this.playerConfig.fullscreenTarget = this.config.target\n }\n\n const fullEl = Util.getFullScreenEl()\n\n if (playerConfig.fullscreenTarget === fullEl) {\n this.player.getFullscreen().catch(e=>{})\n }\n\n this.initIcons()\n\n this.handleFullscreen = this.hook('fullscreenChange', this.toggleFullScreen, {\n pre: (e) => {\n const { fullscreen } = this.player\n this.emitUserAction(e, 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n }\n })\n\n this.bind('.xgplayer-fullscreen', ['touchend', 'click'], this.handleFullscreen)\n\n this.on(Events.FULLSCREEN_CHANGE, (isFullScreen) => {\n const tipsDom = this.find('.xg-tips')\n tipsDom && this.changeLangTextKey(tipsDom, isFullScreen ? this.i18nKeys.EXITFULLSCREEN_TIPS : this.i18nKeys.FULLSCREEN_TIPS)\n this.animate(isFullScreen)\n })\n if (this.config.needBackIcon) {\n this.topBackIcon = this.player.registerPlugin({\n plugin: TopBackIcon,\n options: {\n config: {\n onClick: (e) => {\n this.handleFullscreen(e)\n }\n }\n }\n })\n }\n if (Sniffer.device === 'mobile') {\n window.addEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n /**\n * @private\n */\n _onOrientationChange = (e) => {\n if (this.player.fullscreen && this.config.rotateFullscreen) {\n if (window.orientation === 90 || window.orientation === -90) {\n this.player.setRotateDeg(0)\n } else {\n this.player.setRotateDeg(90)\n }\n }\n }\n\n registerIcons () {\n return {\n fullscreen: { icon: FullScreenSvg, class: 'xg-get-fullscreen' },\n exitFullscreen: { icon: ExitFullScreenSvg, class: 'xg-exit-fullscreen' }\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.handleFullscreen)\n if (Sniffer.device === 'mobile') {\n window.removeEventListener('orientationchange', this._onOrientationChange)\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.fullscreen)\n this.appendChild('.xgplayer-icon', icons.exitFullscreen)\n }\n\n /**\n * 切换全屏\n * @param { Event } [e]\n */\n toggleFullScreen (e) {\n if (e instanceof Event) {\n e.preventDefault()\n e.stopPropagation()\n }\n const { player, config } = this\n const useCssFullscreen = config.useCssFullscreen === true || (typeof config.useCssFullscreen === 'function' && config.useCssFullscreen())\n if (useCssFullscreen) {\n if (player.fullscreen) {\n player.exitCssFullscreen()\n } else {\n player.getCssFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.rotateFullscreen) {\n if (player.fullscreen) {\n player.exitRotateFullscreen()\n } else {\n player.getRotateFullscreen()\n }\n this.animate(player.fullscreen)\n } else if (config.switchCallback && typeof config.switchCallback === 'function') {\n config.switchCallback(player.fullscreen)\n } else {\n if (player.fullscreen) {\n player.exitFullscreen()\n\n if (config.useScreenOrientation) {\n this.unlockScreen()\n }\n } else {\n player.getFullscreen().catch(e => {})\n\n if (config.useScreenOrientation && player.aspectRatio > 1) {\n this.lockScreen(config.lockOrientationType)\n }\n }\n }\n }\n\n /**\n *\n * @param { boolean } isFullScreen\n */\n animate (isFullScreen) {\n isFullScreen ? this.setAttr('data-state', 'full') : this.setAttr('data-state', 'normal')\n if (this.topBackIcon) {\n if (isFullScreen) {\n this.topBackIcon.show()\n this.hide()\n } else {\n this.topBackIcon.hide()\n this.show()\n }\n }\n }\n\n /**\n * @returns\n */\n render () {\n if (this.config.disable) {\n return\n }\n const langKey = 'FULLSCREEN_TIPS'\n return `<xg-icon class=\"xgplayer-fullscreen\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, langKey, this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n\n /**\n * 锁定屏幕方向,只有部分移动端浏览器支持\n * 兼容性参考:https://caniuse.com/mdn-api_screenorientation_lock\n * @param {OrientationType} orientation\n */\n lockScreen (orientation) {\n try {\n screen.orientation.lock(orientation).catch(e => {})\n } catch (e) {\n }\n }\n\n /**\n * 解锁屏幕方向锁定,只有部分移动端浏览器支持\n */\n unlockScreen () {\n try {\n screen.orientation.unlock().catch(e => {})\n } catch (e) {\n }\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\nclass Play extends IconPlugin {\n static get pluginName () {\n return 'play'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 0,\n disable: false\n }\n }\n\n afterCreate () {\n super.afterCreate()\n const { config } = this\n if (config.disable) {\n return\n }\n this.initIcons()\n this.bind(['touchend', 'click'], this.btnClick)\n\n this.listenEvents()\n this.animate(true)\n }\n\n listenEvents () {\n const { player } = this\n this.on([Events.PLAY, Events.PAUSE, Events.ERROR, Events.EMPTIED], () => {\n this.animate(player.paused)\n })\n }\n\n registerIcons () {\n return {\n play: { icon: PlaySvg, class: 'xg-icon-play' },\n pause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n btnClick = (e) => {\n e.preventDefault()\n e.stopPropagation()\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { prop: 'paused', from: player.paused, to: !player.paused })\n if (player.ended) {\n player.replay()\n } else if (player.paused) {\n player.play()\n this.animate(false)\n } else {\n player.pause()\n this.animate(true)\n }\n return false\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.play)\n this.appendChild('.xgplayer-icon', icons.pause)\n }\n\n animate (paused) {\n if (!this.player) {return}\n const { i18nKeys } = this\n const tipDom = this.find('.xg-tips')\n if (paused) {\n this.setAttr('data-state', 'pause')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PLAY_TIPS)\n } else {\n this.setAttr('data-state', 'play')\n tipDom && this.changeLangTextKey(tipDom, i18nKeys.PAUSE_TIPS)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['touchend', 'click'], this.btnClick)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-play\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAY_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default Play\n","import { Util } from '../../plugin'\n\nconst TPL = [\n { tag: 'xg-cache', className: 'xgplayer-progress-cache', styleKey: 'cachedColor' },\n { tag: 'xg-played', className: 'xgplayer-progress-played', styleKey: 'playedColor' }\n]\n\nexport default class InnerList {\n constructor (args) {\n this.fragments = args.fragments || []\n if (this.fragments.length === 0) {\n this.fragments.push({ percent: 1 })\n }\n this._callBack = args.actionCallback\n this.fragConfig = {\n fragFocusClass: args.fragFocusClass || 'inner-focus-point', // 'inner-focus',\n fragAutoFocus: !!args.fragAutoFocus,\n fragClass: args.fragClass || ''\n }\n this.style = args.style || {\n playedColor: '',\n cachedColor: '',\n progressColor: ''\n }\n this.duration = 0\n this.cachedIndex = 0\n this.playedIndex = 0\n this.focusIndex = -1\n }\n\n updateDuration (duration) {\n this.duration = duration\n let start = 0\n const { fragments } = this\n this.fragments = fragments.map(item => {\n item.start = parseInt(start, 10)\n item.end = parseInt(start + item.percent * this.duration, 10)\n item.duration = parseInt(item.percent * this.duration, 10)\n start += item.percent * this.duration\n return item\n })\n }\n\n updateProgress (type = 'played', data = { newIndex: 0, curIndex: 0, millisecond: 0 }) {\n const { progressList, fragments } = this\n if (progressList.length < 1) {\n return\n }\n const { newIndex, curIndex, millisecond } = data\n if (newIndex !== curIndex) {\n progressList.map((item, index) => {\n if (index < newIndex) {\n item[type].style.width = '100%'\n } else if (index > newIndex) {\n item[type].style.width = 0\n }\n })\n }\n const curPFrag = fragments[newIndex]\n const per = millisecond === 0 ? 0 : (millisecond - curPFrag.start) / curPFrag.duration\n progressList[newIndex][type].style.width = per < 0 ? 0 : `${per * 100}%`\n }\n\n updateFocus (data) {\n if (!this.fragConfig.fragAutoFocus || this.fragments.length < 2) {\n return\n }\n if (!data) {\n // 取消焦点\n if (this.focusIndex > -1) {\n this.unHightLight(this.focusIndex)\n const _data = {\n index: -1,\n preIndex: this.focusIndex,\n fragment: null\n }\n this._callBack && this._callBack(_data)\n this.focusIndex = -1\n }\n return\n }\n const newPIndex = this.findIndex(data.currentTime * 1000, this.focusIndex)\n if (newPIndex >= 0 && newPIndex !== this.focusIndex) {\n this.focusIndex > -1 && this.unHightLight(this.focusIndex)\n this.setHightLight(newPIndex)\n const _data = {\n index: newPIndex,\n preIndex: this.focusIndex,\n fragment: this.fragments[this.focusIndex]\n }\n this.focusIndex = newPIndex\n this._callBack && this._callBack(_data)\n }\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!this.duration || parseInt(duration * 1000, 10) !== this.duration) {\n if (!duration && duration !== 0) {\n return\n }\n this.updateDuration(parseInt(duration * 1000, 10))\n }\n const { playedIndex, cachedIndex } = this\n if (Util.typeOf(data.played) !== 'Undefined') {\n const newPIndex = this.findIndex(data.played * 1000, playedIndex)\n if (newPIndex < 0) {\n return\n }\n this.updateProgress('played', {\n newIndex: newPIndex,\n curIndex: playedIndex,\n millisecond: parseInt(data.played * 1000, 10)\n })\n this.playedIndex = newPIndex\n }\n\n if (Util.typeOf(data.cached) !== 'Undefined') {\n const newCIndex = this.findIndex(data.cached * 1000, cachedIndex)\n if (newCIndex < 0) {\n return\n }\n this.updateProgress('cached', {\n newIndex: newCIndex,\n curIndex: cachedIndex,\n millisecond: parseInt(data.cached * 1000, 10)\n })\n this.cachedIndex = newCIndex\n }\n }\n\n findIndex (time, curIndex) {\n const { fragments } = this\n if (!fragments || fragments.length === 0) {\n return -1\n }\n if (fragments.length === 1) {\n return 0\n }\n if (curIndex > -1 && curIndex < fragments.length && time > fragments[curIndex].start && time < fragments[curIndex].end) {\n return curIndex\n }\n if (time > fragments[fragments.length - 1].start) {\n return fragments.length - 1\n }\n\n for (let i = 0; i < fragments.length; i++) {\n if (time > fragments[i].start && time <= fragments[i].end) {\n curIndex = i\n break\n }\n }\n return curIndex\n }\n\n findHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n if (Util.hasClass(children[i], this.fragConfig.fragFocusClass)) {\n return {\n dom: children[i],\n pos: children[i].getBoundingClientRect()\n }\n }\n }\n }\n\n // 根据索引获取进度条片段\n findFragment (index) {\n const children = this.root.children\n if (index < 0 || index >= children.length) {\n return null\n }\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n\n unHightLight () {\n const children = this.root.children\n for (let i = 0; i < children.length; i++) {\n Util.removeClass(children[i], this.fragConfig.fragFocusClass)\n }\n }\n\n setHightLight (index) {\n const children = this.root.children\n if (index < children.length) {\n Util.addClass(children[index], this.fragConfig.fragFocusClass)\n return {\n dom: children[index],\n pos: children[index].getBoundingClientRect()\n }\n }\n }\n\n destroy () {\n this.progressList = null\n this.fragments = null\n this.root.innerHTML = ''\n }\n\n /**\n * 重置当前\n * @param {*} newOptions\n */\n reset (newOptions) {\n // 更新fragConfig\n Object.keys(this.fragConfig).forEach(key => {\n if (newOptions[key] !== undefined) {\n this.fragConfig[key] = newOptions[key]\n }\n })\n if (newOptions.fragments) {\n this.fragments = newOptions.fragments.length === 0 ? [{ percent: 1 }] : newOptions.fragments\n this.updateDuration(this.duration)\n this.playedIndex = 0\n this.cachedIndex = 0\n // 移除分段信息\n if (this.root) {\n const _c = this.root.children\n while (_c.length > 0) {\n this.root.removeChild(_c[0])\n }\n }\n // 重新渲染\n this.render()\n }\n }\n\n render () {\n const { progressColor } = this.style\n if (!this.root) {\n this.root = Util.createDom('xg-inners', '', {}, 'progress-list')\n }\n if (this.fragments) {\n const { fragClass, fragFocusClass } = this.fragConfig\n this.progressList = this.fragments.map((item) => {\n const inner = Util.createDom('xg-inner', '', {\n style: progressColor ? `background:${progressColor}; flex: ${item.percent}` : `flex: ${item.percent}`\n }, `${item.isFocus ? fragFocusClass : ''} xgplayer-progress-inner ${fragClass}`)\n\n this.root.appendChild(inner)\n\n TPL.forEach(item => {\n inner.appendChild(Util.createDom(item.tag, '', {\n style: item.styleKey ? `background: ${this.style[item.styleKey]}; width:0;` : 'width:0;'\n }, item.className))\n })\n\n return {\n cached: inner.children[0],\n played: inner.children[1]\n }\n })\n }\n return this.root\n }\n}\n","import Plugin, { Events, Util, POSITIONS, Sniffer } from '../../plugin'\nimport InnerList from './innerList'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?:string,\n * disable?: boolean,\n * isDraggingSeek?: boolean, // 是否在拖拽的过程中更新currentTime\n * closeMoveSeek?: boolean, // 是否关闭滑块seek能力\n * isPauseMoving?: boolean, // 是否在move的时候暂停视频内容\n * isCloseClickSeek?: boolean, // 是否关闭点击进度条的时候seek\n * fragments?: Array<{percent: number}>,\n * fragFocusClass?: string, // 进度条分段高亮类名\n * fragAutoFocus?: boolean, // 是否hover的时候自动高亮\n * miniMoveStep?: number,\n * miniStartStep?: number,\n * onMoveStart?: () => any, // 手势开始移动回调,\n * onMoveEnd?: () => any, // 手势移动结束回调\n * endedDiff?: number,\n * [propName: string]: any\n * }} IProgressConfig\n */\n/**\n * 进度条组件\n */\n\n// 分段获取焦点显示的时候的两种class类型\nconst FRAGMENT_FOCUS_CLASS = {\n POINT: 'inner-focus-point',\n HIGHLIGHT: 'inner-focus-highlight'\n}\nclass Progress extends Plugin {\n static get pluginName () {\n return 'progress'\n }\n\n /**\n * @type IProgressConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_CENTER,\n index: 0,\n disable: false,\n isDraggingSeek: true, // 是否在拖拽的过程中更新currentTime\n closeMoveSeek: false, // 是否关闭滑块seek能力\n isPauseMoving: false, // 是否在move的时候暂停视频内容\n isCloseClickSeek: false, // 是否关闭点击进度条的时候seek\n fragments: [{ percent: 1 }],\n fragFocusClass: FRAGMENT_FOCUS_CLASS.POINT,\n fragClass: '', // 内置进度条类名\n fragAutoFocus: false, // 是否hover的时候自动高亮\n miniMoveStep: 5,\n miniStartStep: 2,\n onMoveStart: () => {\n }, // 手势开始移动回调\n onMoveEnd: () => {}, // 手势移动结束回调\n endedDiff: 0.2\n }\n }\n\n static get FRAGMENT_FOCUS_CLASS () {\n return FRAGMENT_FOCUS_CLASS\n }\n\n constructor (args) {\n super(args)\n /**\n * @readonly\n */\n this.useable = false\n /**\n * @readonly\n */\n this.isProgressMoving = false\n\n /**\n * @private\n */\n this.__dragCallBacks = []\n /**\n * @private\n */\n this._state = {\n now: -1,\n direc: 0,\n time: 0,\n prePlayTime: -1\n }\n\n this._disableBlur = false\n\n // 兼容旧版本\n if (typeof this.config.isDragingSeek === 'boolean') {\n console.warn('[XGPLAYER] \\'isDragingSeek\\' is deprecated, please use \\'isDraggingSeek\\' instead')\n this.config.isDraggingSeek = this.config.isDragingSeek\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : (currentTime + this.timeOffset)\n }\n\n changeState (useable = true) {\n this.useable = useable\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n this.root && (this.root.style.display = 'flex')\n }\n /**\n * @description 创建内部进度条,并挂载到xg-outer上,\n * 并把一些对外API绑定在progress上供外部调用\n *\n */\n _initInner (fragments = [], config = {}) {\n if (!fragments || fragments.length === 0) {\n fragments = [{ percent: 1 }]\n }\n const _c = {\n fragments,\n ...config,\n actionCallback: (data) => {\n this.emitUserAction('fragment_focus', 'fragment_focus', data)\n }\n }\n if (!this.innerList) {\n this.innerList = new InnerList(_c)\n this.outer.insertBefore(this.innerList.render(), this.outer.children[0]);\n ['findHightLight', 'unHightLight', 'setHightLight', 'findFragment'].map(item => {\n this[item] = this.innerList[item].bind(this.innerList)\n })\n } else {\n this.innerList.reset(_c)\n }\n }\n\n _updateInnerFocus (data) {\n this.innerList && this.innerList.updateFocus(data)\n }\n\n afterCreate () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n this.pos = {\n x: 0, // 水平方向位移\n y: 0, // 垂直方向位移\n moving: false, // 是否正在移动\n isDown: false, // 是否mouseDown\n isEnter: false, // 是否触发了mouseEnter\n isLocked: false // 是否刚刚锁定回过进度条\n }\n this.outer = this.find('xg-outer')\n const { fragFocusClass, fragAutoFocus, fragClass } = this.config\n this._initInner(this.config.fragments, { fragFocusClass, fragAutoFocus, fragClass, style: this.playerConfig.commonStyle || {} })\n if (Sniffer.device === 'mobile') {\n this.config.isDraggingSeek = false\n this.isMobile = true\n }\n\n this.progressBtn = this.find('.xgplayer-progress-btn')\n\n this.listenEvents()\n this.bindDomEvents()\n this.initCustomStyle()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adProgress.js\n */\n listenEvents () {\n this.on(Events.DURATION_CHANGE, () => {\n this.onMouseLeave()\n })\n\n this.on(Events.TIME_UPDATE, () => {\n this.onTimeupdate()\n })\n\n this.on(Events.SEEKED, () => {\n this.onTimeupdate()\n this.onCacheUpdate()\n })\n\n this.on(Events.PROGRESS, () => {\n this.onCacheUpdate()\n })\n\n this.on(Events.ENDED, () => {\n this.onCacheUpdate(true)\n this.onTimeupdate(true)\n this._state.now = 0\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n\n this.on(Events.VIDEO_RESIZE, () => {\n this.onVideoResize()\n })\n }\n\n /**\n * @description 配置更新响应,插件内置调用api, 播放器整体配置更新的时候调用\n * @param {IProgressConfig} config\n */\n setConfig (config) {\n let frags = null\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n if (key === 'fragments') {\n frags = config[key]\n }\n })\n if (frags) {\n this._initInner(frags, config)\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { sliderBtnStyle } = commonStyle\n const { progressBtn } = this\n if (sliderBtnStyle) {\n if (typeof sliderBtnStyle === 'string') {\n progressBtn.style.boxShadow = sliderBtnStyle\n } else if (typeof sliderBtnStyle === 'object') {\n Object.keys(sliderBtnStyle).map(key => {\n progressBtn.style[key] = sliderBtnStyle[key]\n })\n }\n }\n }\n\n /**\n * 触发某一类回调监听\n * @param { string } type 类型 drag/dragend\n * @param { any} data 具体数据\n */\n triggerCallbacks (type, data, event) {\n if (this.__dragCallBacks.length > 0) {\n this.__dragCallBacks.map(item => {\n if (item && item.handler && item.type === type) {\n try {\n item.handler(data, event)\n } catch (error) {\n console.error(`[XGPLAYER][triggerCallbacks] ${item} error`, error)\n }\n }\n })\n }\n }\n\n /**\n * 供外部插件添加回调\n * @param {string} type 类型 drag/dragend\n * @param {function} handle 回调函数句柄\n */\n addCallBack (type, handle) {\n if (handle && typeof handle === 'function') {\n this.__dragCallBacks.push({ type: type, handler: handle })\n }\n }\n\n /**\n * 供外部插件移除回调\n * @param {string} type 类型 drag/dragend\n * @param {Function} event 回调函数句柄\n */\n removeCallBack (type, event) {\n const { __dragCallBacks } = this\n let _index = -1\n __dragCallBacks.map((item, index) => {\n if (item && item.type === type && item.handler === event) {\n _index = index\n }\n })\n if (_index > -1) {\n __dragCallBacks.splice(_index, 1)\n }\n }\n\n /**\n * @description 解除进度条的所动状态\n * @returns\n */\n unlock () {\n const { player, pos } = this\n pos.isEnter = false\n pos.isLocked = false\n if (player.isMini) {\n return\n }\n this.unbind('mousemove', this.onMoveOnly)\n if (pos.isDown) {\n this.unbind('mouseleave', this.onMouseLeave)\n return\n }\n this.blur()\n }\n\n bindDomEvents () {\n const { config } = this.player\n this._mouseDownHandlerHook = this.hook('dragstart', this._mouseDownHandler)\n this._mouseUpHandlerHook = this.hook('dragend', this._mouseUpHandler)\n this._mouseMoveHandlerHook = this.hook('drag', this._mouseMoveHandler)\n\n if (this.domEventType === 'touch' || this.domEventType === 'compatible') {\n this.root.addEventListener('touchstart', this.onMouseDown)\n }\n\n if (this.domEventType === 'mouse' || this.domEventType === 'compatible') {\n this.bind('mousedown', this.onMouseDown)\n config.isMobileSimulateMode !== 'mobile' && this.bind('mouseenter', this.onMouseEnter)\n this.bind('mouseover', this.onMouseOver)\n this.bind('mouseout', this.onMouseOut)\n // 避免触发videoClick 暂停/播放切换\n this.player.root.addEventListener('click', this.onBodyClick, true)\n }\n }\n\n _getRootDocument () {\n return this.root?.ownerDocument || document\n }\n\n _addDragDocumentEvents () {\n const dragDocument = this._getRootDocument()\n this._dragDocument = dragDocument\n dragDocument.addEventListener('mousemove', this.onMouseMove, false)\n dragDocument.addEventListener('mouseup', this.onMouseUp, false)\n }\n\n _removeDragDocumentEvents () {\n const dragDocument = this._dragDocument || this._getRootDocument()\n dragDocument.removeEventListener('mousemove', this.onMouseMove, false)\n dragDocument.removeEventListener('mouseup', this.onMouseUp, false)\n this._dragDocument = null\n }\n\n focus () {\n this.player.controls.pauseAutoHide()\n Util.addClass(this.root, 'active')\n }\n\n blur () {\n if (this._disableBlur) {\n return\n }\n this.player.controls.recoverAutoHide()\n Util.removeClass(this.root, 'active')\n }\n\n disableBlur () {\n this._disableBlur = true\n }\n\n enableBlur () {\n this._disableBlur = false\n }\n\n onMoveOnly = (e, data) => {\n const { pos, config, player } = this\n let ret = data\n if (e) {\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (pos.moving && Math.abs(pos.x - x) < config.miniMoveStep) {\n return\n }\n pos.moving = true\n pos.x = x\n ret = this.computeTime(e, x)\n }\n this.triggerCallbacks('dragmove', ret, e)\n this._updateInnerFocus(ret)\n }\n\n /**\n * 避免mouseup的时候触发父辈节点的click事件,和单击视频区域切换暂停/播放互斥\n * @param {*} e\n * @returns\n */\n onBodyClick = (e) => {\n if (!this.pos.isLocked) {\n return\n }\n this.pos.isLocked = false\n e.preventDefault()\n e.stopPropagation()\n }\n\n _mouseDownHandler = (event, data) => {\n this._state.time = data.currentTime\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 0)\n this._updateInnerFocus(data)\n }\n\n _mouseUpHandler = (e, data) => {\n const { pos } = this\n pos.moving && this.updateWidth(data.currentTime, data.seekTime, data.percent, 2)\n }\n\n _mouseMoveHandler = (e, data) => {\n const { _state, pos, config, player } = this\n if (_state.time < data.currentTime) {\n data.forward = true\n } else {\n data.forward = false\n }\n _state.time = data.currentTime\n if (pos.isDown && !pos.moving) {\n pos.moving = true\n config.isPauseMoving && player.pause()\n this.triggerCallbacks('dragstart', data, e)\n this.emitUserAction('drag', 'dragstart', data)\n }\n this.updateWidth(data.currentTime, data.seekTime, data.percent, 1)\n this.triggerCallbacks('dragmove', data, e)\n this._updateInnerFocus(data)\n }\n\n onMouseDown = (e) => {\n const { _state, player, pos, config, playerConfig } = this\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n if (player.isMini || config.closeMoveSeek || (!playerConfig.allowSeekAfterEnded && player.ended)) {\n return\n }\n\n if (!player.duration && !player.isPlaying) {\n player.play()\n return\n }\n e.stopPropagation()\n // e.preventDefault()\n this.focus()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n Util.checkIsFunction(config.onMoveStart) && config.onMoveStart()\n Util.event(e)\n pos.x = x\n pos.isDown = true\n pos.moving = false\n _state.prePlayTime = player.currentTime\n\n // 交互开始 禁止控制栏的自动隐藏功能\n player.focus({ autoHide: false })\n this.isProgressMoving = true\n Util.addClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseDownHandlerHook(e, ret)\n\n const eventType = e.type\n if (eventType === 'touchstart') {\n this.root.addEventListener('touchmove', this.onMouseMove)\n this.root.addEventListener('touchend', this.onMouseUp)\n this.root.addEventListener('touchcancel', this.onMouseUp)\n } else {\n this.unbind('mousemove', this.onMoveOnly)\n this._addDragDocumentEvents()\n // this.bind('mouseup', this.onMouseUp, false)\n }\n return true\n }\n\n onMouseUp = (e) => {\n const { player, config, pos, playerConfig, _state } = this\n if (!pos) {\n return\n }\n e.stopPropagation()\n e.preventDefault()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.event(e)\n Util.removeClass(this.progressBtn, 'active')\n\n const ret = this.computeTime(e, pos.x)\n ret.prePlayTime = _state.prePlayTime\n if (pos.moving) {\n this.triggerCallbacks('dragend', ret, e)\n this.emitUserAction('drag', 'dragend', ret)\n } else {\n this.triggerCallbacks('click', ret, e)\n this.emitUserAction('click', 'click', ret)\n }\n this._mouseUpHandlerHook(e, ret)\n\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = true\n _state.prePlayTime = 0\n _state.time = 0\n const eventType = e.type\n if (eventType === 'touchend' || eventType === 'touchcancel') {\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n // 交互结束 恢复控制栏的隐藏流程\n this.blur()\n } else {\n this._removeDragDocumentEvents()\n if (!pos.isEnter) {\n this.onMouseLeave(e)\n } else {\n playerConfig.isMobileSimulateMode !== 'mobile' && this.bind('mousemove', this.onMoveOnly)\n }\n }\n // 延迟复位,状态复位要在dom相关时间回调执行之后\n Util.setTimeout(this, () => {\n this.resetSeekState()\n }, 1)\n // 交互结束 恢复控制栏的隐藏流程\n player.focus()\n }\n\n resetDragState () {\n const { pos, playerConfig, config } = this\n if (!pos) {\n return\n }\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n this._removeDragDocumentEvents()\n if (!pos.isDown && !this.isProgressMoving) {\n return\n }\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n Util.checkIsFunction(config.onMoveEnd) && config.onMoveEnd()\n Util.removeClass(this.progressBtn, 'active')\n pos.moving = false\n pos.isDown = false\n pos.x = 0\n pos.y = 0\n pos.isLocked = false\n this._state.prePlayTime = 0\n this._state.time = 0\n this.resetSeekState()\n this.blur()\n }\n\n onMouseMove = (e) => {\n const { _state, pos, player, config } = this\n if (Util.checkTouchSupport()) {\n // e.stopPropagation()\n e.preventDefault()\n }\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const diff = Math.abs(pos.x - x)\n if ((pos.moving && diff < config.miniMoveStep) || (!pos.moving && diff < config.miniStartStep)) {\n return\n }\n pos.x = x\n const ret = this.computeTime(e, x)\n ret.prePlayTime = _state.prePlayTime\n this._mouseMoveHandlerHook(e, ret)\n }\n\n onMouseOut = (e) => {\n this.triggerCallbacks('mouseout', null, e)\n }\n\n onMouseOver = (e) => {\n this.triggerCallbacks('mouseover', null, e)\n }\n\n onMouseEnter = (e) => {\n const { player, pos } = this\n if (pos.isDown || pos.isEnter || player.isMini || (!player.config.allowSeekAfterEnded && player.ended)) {\n return\n }\n pos.isEnter = true\n this.bind('mousemove', this.onMoveOnly)\n this.bind('mouseleave', this.onMouseLeave)\n // 计算预览位置\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n const x = player.rotateDeg === 90 ? _ePos.clientY : _ePos.clientX\n const ret = this.computeTime(e, x)\n this.triggerCallbacks('mouseenter', ret, e)\n this.focus()\n }\n\n onMouseLeave = (e) => {\n this.triggerCallbacks('mouseleave', null, e)\n this.unlock()\n this._updateInnerFocus(null)\n }\n\n onVideoResize = () => {\n const { x, isDown, isEnter } = this.pos\n if (isEnter && !isDown) {\n const ret = this.computeTime(null, x)\n this.onMoveOnly(null, ret)\n }\n }\n\n /**\n * @description 根据currenTime和占用百分比更新进度条\n * @param {number} currentTime 需要更新到的时间\n * @param {number} seekTime 实际seek的时间\n * @param {number} percent 更新时间占比\n * @param {number} type 触发类型 0-down 1-move 2-up\n */\n updateWidth (currentTime, seekTime, percent, type) {\n const { config, player } = this\n if (config.isCloseClickSeek && type === 0) {\n return\n }\n\n const realTime = seekTime = seekTime >= player.duration ? player.duration - config.endedDiff : Number(seekTime).toFixed(1)\n\n this.updatePercent(percent)\n this.updateTime(currentTime)\n if (type === 1 && (!config.isDraggingSeek || player.config.mediaType === 'audio')) {\n return\n }\n this._state.now = realTime\n this._state.direc = realTime > player.currentTime ? 0 : 1\n player.seek(realTime)\n }\n\n computeTime (e, x) {\n const { player } = this\n const { width, height, top, left } = this.root.getBoundingClientRect()\n let rWidth, rLeft\n const clientX = x\n if (player.rotateDeg === 90) {\n rWidth = height\n rLeft = top\n } else {\n rWidth = width\n rLeft = left\n }\n let offset = clientX - rLeft\n offset = offset > rWidth ? rWidth : (offset < 0 ? 0 : offset)\n let percent = offset / rWidth\n percent = percent < 0 ? 0 : (percent > 1 ? 1 : percent)\n if(Number.isNaN(percent)){\n percent = this.player.currentTime / this.offsetDuration\n }\n const currentTime = parseInt(percent * this.offsetDuration * 1000, 10) / 1000\n const seekTime = Util.getCurrentTimeByOffset(currentTime, player.timeSegments)\n return {\n percent,\n currentTime,\n seekTime,\n offset,\n width: rWidth,\n left: rLeft,\n e\n }\n }\n\n /**\n * @description 更新时间插件,在拖拽状态下要接管时间插件的更新状态\n * 本位置会和time插件交互\n * @param {number} time 根据拖拽距离计算出的时间\n */\n updateTime (time) {\n const { player, duration } = this\n if (time > duration) {\n time = duration\n } else if (time < 0) {\n time = 0\n }\n const timeIcon = player.plugins.time\n if (timeIcon) {\n timeIcon.updateTime(time)\n }\n }\n\n /**\n * @description 复位正在拖拽状态 ,拖拽的时候要避免timeupdate更新\n */\n resetSeekState () {\n this.isProgressMoving = false\n const timeIcon = this.player.plugins.time\n timeIcon && timeIcon.resetActive()\n }\n\n /**\n * @description 拖拽过程中更新UI\n * @param {number} percent 小于0的小数\n *\n */\n updatePercent (percent, notSeek) {\n this.isProgressMoving = true\n if (this.config.disable) {\n return\n }\n percent = percent > 1 ? 1 : (percent < 0 ? 0 : percent)\n this.progressBtn.style.left = `${percent * 100}%`\n this.innerList.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n const { miniprogress } = this.player.plugins\n miniprogress && miniprogress.update({ played: percent * this.offsetDuration }, this.offsetDuration)\n }\n\n /**\n * @description 播放进度更新\n * @param { boolean } isEnded 是否是播放结束的时候调用\n * @returns\n */\n onTimeupdate (isEnded) {\n const { player, _state, offsetDuration } = this\n if ((player.isSeeking && player.media.seeking) || this.isProgressMoving || !player.hasStart) {\n return\n }\n if (_state.now > -1) {\n const abs = parseInt(_state.now * 1000, 10) - parseInt(player.currentTime * 1000, 10)\n if ((_state.direc === 0 && abs > 300) || (_state.direc === 1 && abs > -300)) {\n _state.now = -1\n return\n } else {\n _state.now = -1\n }\n }\n let time = this.currentTime // this.timeOffset + player.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, isEnded)\n this.innerList.update({ played: time }, offsetDuration)\n this.progressBtn.style.left = `${time / offsetDuration * 100}%`\n }\n\n /**\n * @description 缓存进度更新\n * @param { boolean } isEnded 是否是结束时触发\n * @returns\n */\n onCacheUpdate (isEnded) {\n const { player, duration } = this\n if (!player) {\n return\n }\n // 兼容设置了customDuration, 实际时长和要显示的时不一致问题\n let _end = player.bufferedPoint.end\n _end = Util.adjustTimeByDuration(_end, duration, isEnded)\n this.innerList.update({ cached: _end }, duration)\n }\n\n onReset () {\n this.innerList.update({ played: 0, cached: 0 }, 0)\n this.progressBtn.style.left = '0%'\n }\n\n destroy () {\n const { player } = this\n this.thumbnailPlugin = null\n this.innerList.destroy()\n this.innerList = null\n const { domEventType } = this\n if (domEventType === 'touch' || domEventType === 'compatible') {\n this.root.removeEventListener('touchstart', this.onMouseDown)\n this.root.removeEventListener('touchmove', this.onMouseMove)\n this.root.removeEventListener('touchend', this.onMouseUp)\n this.root.removeEventListener('touchcancel', this.onMouseUp)\n }\n if (domEventType === 'mouse' || domEventType === 'compatible') {\n this.unbind('mousedown', this.onMouseDown)\n this.unbind('mouseenter', this.onMouseEnter)\n this.unbind('mousemove', this.onMoveOnly)\n this.unbind('mouseleave', this.onMouseLeave)\n this._removeDragDocumentEvents()\n player.root.removeEventListener('click', this.onBodyClick, true)\n }\n }\n\n render () {\n if (this.config.disable || this.playerConfig.isLive) {\n return\n }\n const controlsMode = this.player.controls ? this.player.controls.config.mode : ''\n const className = controlsMode === 'bottom' ? 'xgplayer-progress-bottom' : ''\n return `\n <xg-progress class=\"xgplayer-progress ${className}\">\n <xg-outer class=\"xgplayer-progress-outer\">\n <xg-progress-btn class=\"xgplayer-progress-btn\"></xg-progress-btn>\n </xg-outer>\n </xg-progress>\n `\n }\n}\n\nexport default Progress\n","import Plugin, { Util, Events, POSITIONS } from '../../plugin'\nimport './index.scss'\n\nclass Time extends Plugin {\n static get pluginName () {\n return 'time'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 2,\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.isActiving = false\n }\n\n get duration () {\n const { offsetDuration, duration } = this.player\n return this.playerConfig.customDuration || offsetDuration || duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n afterCreate () {\n const constrolsMode = this.player.controls.config.mode\n this.mode = constrolsMode === 'flex' ? 'flex' : 'normal'\n if (this.config.disable) {\n return\n }\n if (this.mode === 'flex') {\n this.createCenterTime()\n this.root.style.display = 'none'\n }\n this.durationDom = this.find('.time-duration')\n this.timeDom = this.find('.time-current')\n\n this.listenEvents()\n }\n\n /**\n * This method can be overridden.\n * Eg. xgplayer-ads/ui/adTime.js\n */\n listenEvents () {\n this.on([Events.DURATION_CHANGE, Events.SEEKED, Events.TIME_UPDATE], (e) => {\n if (e.eventName === 'durationchange') {\n this.isActiving = false\n }\n this.onTimeUpdate()\n })\n\n this.on(Events.ENDED, () => {\n // 因为customDuration存在,最终播放currentTime可能和显示的duration不统一,所以在ended的时候修正\n this.onTimeUpdate(true)\n })\n\n this.on(Events.EMPTIED, () => {\n this.onReset()\n })\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'block')\n this.centerDurDom && (this.centerDurDom.style.display = 'block')\n return\n }\n this.root.style.display = 'block'\n }\n\n hide () {\n if (this.mode === 'flex') {\n this.centerCurDom && (this.centerCurDom.style.display = 'none')\n this.centerDurDom && (this.centerDurDom.style.display = 'none')\n return\n }\n this.root.style.display = 'none'\n }\n\n onTimeUpdate (isEnded) {\n const { player, config, duration } = this\n if (config.disable || this.isActiving || !player.hasStart) {\n return\n }\n let current = this.currentTime + this.timeOffset\n current = Util.adjustTimeByDuration(current, duration, isEnded)\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.centerDurDom.innerHTML = Util.format(duration)\n }\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(current))\n if (duration !== Infinity && duration > 0) {\n this.durationDom.innerHTML = Util.format(duration)\n }\n }\n }\n\n onReset () {\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(0))\n this.centerDurDom.innerHTML = Util.format(0)\n } else {\n this.timeDom.innerHTML = this.minWidthTime(Util.format(0))\n this.durationDom.innerHTML = Util.format(0)\n }\n }\n\n createCenterTime () {\n const { player } = this\n if (!player.controls || !player.controls.center) {\n return\n }\n const center = player.controls.center\n this.centerCurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-left'\n )\n this.centerDurDom = Util.createDom(\n 'xg-icon',\n '00:00',\n {},\n 'xgplayer-time xg-time-right'\n )\n center.children.length > 0\n ? center.insertBefore(this.centerCurDom, center.children[0])\n : center.appendChild(this.centerCurDom)\n center.appendChild(this.centerDurDom)\n this.extraEls = [this.centerCurDom, this.centerDurDom]\n }\n\n afterPlayerInit () {\n const { config } = this\n if (this.duration === Infinity || this.playerConfig.isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n }\n if (config.hide) {\n this.hide()\n return\n }\n this.show()\n }\n\n changeLiveState (isLive) {\n if (isLive) {\n Util.hide(this.durationDom)\n Util.hide(this.timeDom)\n Util.hide(this.find('.time-separator'))\n Util.show(this.find('.time-live-tag'))\n } else {\n Util.hide(this.find('.time-live-tag'))\n Util.show(this.find('.time-separator'))\n Util.show(this.durationDom)\n Util.show(this.timeDom)\n }\n }\n\n updateTime (time) {\n this.isActiving = true\n if ((!time && time !== 0) || time > this.duration) {\n return\n }\n if (this.mode === 'flex') {\n this.centerCurDom.innerHTML = this.minWidthTime(Util.format(time))\n return\n }\n this.timeDom.innerHTML = this.minWidthTime(Util.format(time))\n }\n\n minWidthTime (timeStr) {\n return timeStr\n .split(':')\n .map(value => `<span class=\"time-min-width\">${value}</span>`)\n .join(':')\n }\n\n resetActive () {\n const { player } = this\n const updateState = () => {\n this.isActiving = false\n }\n this.off(Events.SEEKED, updateState)\n if (player.isSeeking && player.media.seeking) {\n this.once(Events.SEEKED, updateState)\n } else {\n this.isActiving = false\n }\n }\n\n destroy () {\n const { center } = this.player.controls\n this.centerCurDom && center.removeChild(this.centerCurDom)\n this.centerCurDom = null\n this.centerDurDom && center.removeChild(this.centerDurDom)\n this.centerDurDom = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-time\">\n <span class=\"time-current\">00:00</span>\n <span class=\"time-separator\">/</span>\n <span class=\"time-duration\">00:00</span>\n <span class=\"time-live-tag\">${this.i18n.LIVE_TIP}</span>\n </xg-icon>`\n }\n}\nexport default Time\n","import Plugin, { Util, Events, Sniffer, POSITIONS } from '../../plugin'\nimport volumeLargeSvg from '../assets/volumeLarge.svg'\nimport volumeSmallSvg from '../assets/volumeSmall.svg'\nimport volumeMutedSvg from '../assets/volumeMuted.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string, // [可选]插件挂载的dom\n * index?: number // [可选]插件在播放器中挂载的位置\n * disable?: boolean, // [可选]是否禁用插件交互行为\n * showValueLabel?: boolean, // [可选]是否显示当前滑动的音量数值\n * default?: number // [可选]默认\n * [propName: string]: any\n * }} IVolumeConfig\n */\n\nclass Volume extends Plugin {\n static get pluginName () {\n return 'volume'\n }\n\n /**\n * @type IVolumeConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT, // [可选]插件挂载的dom\n index: 1, // [可选]插件在播放器中挂载的位置\n disable: false, // [可选]是否禁用插件交互行为\n showValueLabel: false, // [可选]是否显示当前滑动的音量数值\n default: 0.6, // [可选]默认音量\n miniVolume: 0.2 // 静音恢复的时候最小音量\n }\n }\n\n registerIcons () {\n return {\n volumeSmall: { icon: volumeSmallSvg, class: 'xg-volume-small' },\n volumeLarge: { icon: volumeLargeSvg, class: 'xg-volume' },\n volumeMuted: { icon: volumeMutedSvg, class: 'xg-volume-mute' }\n }\n }\n\n afterCreate () {\n this._timerId = null\n this._d = {\n isStart: false,\n isMoving: false,\n isActive: false\n }\n if (this.config.disable) {\n return\n }\n\n this.initIcons()\n\n const { commonStyle, volume } = this.playerConfig\n if (commonStyle.volumeColor) {\n this.find('.xgplayer-drag').style.backgroundColor = commonStyle.volumeColor\n }\n this.changeMutedHandler = this.hook('mutedChange', (e) => {\n this.changeMuted(e)\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this._onMouseenterHandler = this.hook('mouseenter', this.onMouseenter)\n this._onMouseleaveHandler = this.hook('mouseleave', this.onMouseleave)\n\n if (!(Sniffer.device === 'mobile') && this.playerConfig.isMobileSimulateMode !== 'mobile') {\n this.bind('mouseenter', this._onMouseenterHandler)\n\n this.bind(['blur', 'mouseleave'], this._onMouseleaveHandler)\n\n this.bind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.bind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.bind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n }\n\n this.bind('.xgplayer-icon', ['touchend', 'click'], this.changeMutedHandler)\n\n this.on(Events.VOLUME_CHANGE, this.onVolumeChange)\n this.once(Events.LOADED_DATA, this.onVolumeChange)\n\n if (Util.typeOf(volume) !== 'Number') {\n this.player.volume = this.config.default\n }\n\n this.onVolumeChange()\n }\n\n onBarMousedown = (e) => {\n const { player } = this\n const bar = this.find('.xgplayer-bar')\n Util.event(e)\n\n const barRect = bar.getBoundingClientRect()\n const pos = Util.getEventPos(e, player.zoom)\n const height = barRect.height - (pos.clientY - barRect.top)\n pos.h = height\n pos.barH = barRect.height\n this.pos = pos\n // 差值小于0,说明点击的不是音量滑块位置 不做响应\n if (height < -2) {\n return\n }\n this.updateVolumePos(height, e)\n document.addEventListener('mouseup', this.onBarMouseUp)\n this._d.isStart = true\n return false\n }\n\n onBarMouseMove = (e) => {\n const { _d } = this\n if (!_d.isStart) {\n return\n }\n const { pos, player } = this\n e.preventDefault()\n e.stopPropagation()\n Util.event(e)\n const _ePos = Util.getEventPos(e, player.zoom)\n _d.isMoving = true\n const w = pos.h - _ePos.clientY + pos.clientY\n if (w > pos.barH) {\n return\n }\n this.updateVolumePos(w, e)\n }\n\n onBarMouseUp = (e) => {\n Util.event(e)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n const { _d } = this\n _d.isStart = false\n _d.isMoving = false\n }\n\n updateVolumePos (height, event) {\n const { player } = this\n const drag = this.find('.xgplayer-drag')\n const bar = this.find('.xgplayer-bar')\n if (!bar || !drag) {\n return\n }\n const now = parseInt(height / bar.getBoundingClientRect().height * 1000, 10)\n drag.style.height = `${height}px`\n const to = Math.max(Math.min(now / 1000, 1), 0)\n const props = {\n volume: {\n from: player.volume,\n to\n }\n }\n if (player.muted) {\n props.muted = {\n from: true,\n to: false\n }\n }\n this.emitUserAction(event, 'change_volume', { muted: player.muted, volume: player.volume, props })\n player.volume = Math.max(Math.min(now / 1000, 1), 0)\n player.muted && (player.muted = false)\n\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n\n /**\n * 修改音量数值标签\n *\n * @memberof Volume\n */\n updateVolumeValue () {\n const { volume, muted } = this.player\n const $labelValue = this.find('.xgplayer-value-label')\n const vol = Math.max(Math.min(volume, 1), 0)\n\n // Math.ceil有精度问题,比如Math.ceil(0.55 * 100) == 56,因此这里使用Math.round\n // 0.58 * 100 === 57.99999999999999\n // 0.55 * 100 === 55.00000000000001\n $labelValue.innerText = muted ? 0 : Math.round(vol * 100)\n }\n\n /**\n * @desc 聚焦\n */\n focus () {\n const { player } = this\n player.focus({ autoHide: false })\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n Util.addClass(this.root, 'slide-show')\n }\n\n /**\n * 失去焦点\n * @param { number } delay 延迟隐藏时长,ms\n * @param { boolean } isForce 是否立即隐藏控制栏\n * @param { Event} [e] 事件\n * @returns\n */\n unFocus (delay = 100, isForce = true, e) {\n const { _d, player } = this\n if (_d.isActive) {\n return\n }\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this._timerId = Util.setTimeout(this, () => {\n if (!_d.isActive) {\n isForce ? player.blur() : player.focus()\n Util.removeClass(this.root, 'slide-show')\n _d.isStart && this.onBarMouseUp(e)\n }\n this._timerId = null\n }, delay)\n }\n\n onMouseenter = (e) => {\n this._d.isActive = true\n this.focus()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n }\n\n onMouseleave = (e) => {\n this._d.isActive = false\n this.unFocus(100, false, e)\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n }\n\n changeMuted (e) {\n // e.preventDefault()\n e && e.stopPropagation()\n const { player, _d } = this\n // 取消bar的状态\n _d.isStart && this.onBarMouseUp(e)\n this.emitUserAction(e, 'change_muted', {\n muted: player.muted,\n volume: player.volume,\n props: {\n muted: {\n from: player.muted,\n to: !player.muted\n }\n }\n })\n if (player.volume > 0) {\n player.muted = !player.muted\n }\n if (player.volume < 0.01) {\n player.volume = this.config.miniVolume\n }\n }\n\n onVolumeChange = (e) => {\n if (!this.player) {\n return\n }\n const { muted, volume } = this.player\n if (!this._d.isMoving) {\n this.find('.xgplayer-drag').style.height = muted || volume === 0 ? '4px' : `${volume * 100}%`\n if (this.config.showValueLabel) {\n this.updateVolumeValue()\n }\n }\n this.animate(muted, volume)\n }\n\n animate (muted, volume) {\n if (muted || volume === 0) {\n this.setAttr('data-state', 'mute')\n } else if (volume < 0.5 && this.icons.volumeSmall) {\n this.setAttr('data-state', 'small')\n } else {\n this.setAttr('data-state', 'normal')\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.volumeSmall)\n this.appendChild('.xgplayer-icon', icons.volumeLarge)\n this.appendChild('.xgplayer-icon', icons.volumeMuted)\n }\n\n destroy () {\n if (this._timerId) {\n Util.clearTimeout(this, this._timerId)\n this._timerId = null\n }\n this.unbind('mouseenter', this.onMouseenter)\n\n this.unbind(['blur', 'mouseleave'], this.onMouseleave)\n\n this.unbind('.xgplayer-slider', 'mousedown', this.onBarMousedown)\n this.unbind('.xgplayer-slider', 'mousemove', this.onBarMouseMove)\n this.unbind('.xgplayer-slider', 'mouseup', this.onBarMouseUp)\n document.removeEventListener('mouseup', this.onBarMouseUp)\n this.unbind('.xgplayer-icon', Sniffer.device === 'mobile' ? 'touchend' : 'click', this.changeMutedHandler)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const volume = this.config.default || this.player.volume\n const isShowVolumeValue = this.config.showValueLabel\n return `\n <xg-icon class=\"xgplayer-volume\" data-state=\"normal\">\n <div class=\"xgplayer-icon\">\n </div>\n <xg-slider class=\"xgplayer-slider\">\n ${isShowVolumeValue ? `<div class=\"xgplayer-value-label\">${volume * 100}</div>` : ''}\n <div class=\"xgplayer-bar\">\n <xg-drag class=\"xgplayer-drag\" style=\"height: ${volume * 100}%\"></xg-drag>\n </div>\n </xg-slider>\n </xg-icon>`\n }\n}\nexport default Volume\n","import BasePlugin, { Events, Util } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nfunction now () {\n return new Date().getTime()\n}\n\nconst LOG_TYPES = {\n LOAD_START: 'loadstart',\n LOADED_DATA: 'loadeddata',\n FIRST_FRAME: 'firstFrame',\n WAIT_START: 'waitingStart',\n WAIT_END: 'waitingEnd',\n SEEK_START: 'seekStart',\n SEEK_END: 'seekEnd'\n}\nclass XGLogger extends BasePlugin {\n static get pluginName () {\n return 'xgLogger'\n }\n\n static get defaultConfig () {\n return {\n waitTimeout: 10000\n }\n }\n\n afterCreate () {\n this._onReset()\n this._waitType = 'firstFrame'\n\n this._initOnceEvents()\n\n this.newPointTime = now()\n // 初始化到首帧耗时 new -> loadeddata\n this.loadedCostTime = 0\n // 初始化到开始请求耗时 new -> loadstart\n this.startCostTime = 0\n\n this.on(Events.LOAD_START, () => {\n const { _state } = this\n const { autoplayStart, isFFSend } = _state\n this.startCostTime = now() - this.newPointTime\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOAD_START`, `autoplayStart:${autoplayStart} isFFSend:${isFFSend} startCostTime:${this.startCostTime} newPointTime${this.newPointTime}`)\n if (isFFSend) {\n return\n }\n !_state.isLs && this.emitLog(LOG_TYPES.LOAD_START, {})\n _state.isLs = true\n _state.isTimeUpdate = false\n _state.isFFLoading = true\n this.pt = now()\n this.vt = 0\n this.fvt = 0 // 首帧耗时 loadstart -> loadeddata\n this._initOnceEvents()\n this._onWaitingLoadStart()\n })\n\n this.on(Events.LOADED_DATA, () => {\n this.vt = now()\n this.fvt = this.vt - this.pt\n this.loadedCostTime = this.vt - this.newPointTime\n const { isTimeUpdate, isFFSend, autoplayStart } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} LOADED_DATA`, `fvt:${this.fvt} isTimeUpdate:${this._state.isTimeUpdate} loadedCostTime:${this.loadedCostTime}`)\n if (isTimeUpdate || autoplayStart) {\n this._sendFF('loadedData')\n }\n if (!isFFSend) {\n this.emitLog(LOG_TYPES.LOADED_DATA, {})\n }\n this.suspendWaitingStatus('loadeddata')\n })\n\n this.on(Events.SEEKING, this._onSeeking)\n this.on(Events.SEEKED, this._onSeeked)\n\n this.on(Events.DESTROY, () => {\n this.endState('destroy')\n })\n\n this.on(Events.URL_CHANGE, () => {\n this.endState('urlChange')\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} URL_CHANGE`)\n this._state.isFFSend && this._onReset()\n })\n\n this.on([Events.PLAYING, Events.CANPLAY], this._onPlaying)\n\n this.on(Events.WAITING, this._onWaiting)\n this.on(Events.ERROR, this._onError)\n this.on(Events.RESET, () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} RESET`)\n this.endState('reset')\n this._initOnceEvents()\n this._onReset()\n })\n }\n\n _initOnceEvents () {\n this.off(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.off(Events.TIME_UPDATE, this._onTimeupdate)\n this.once(Events.AUTOPLAY_STARTED, this._onAutoplayStart)\n this.once(Events.TIME_UPDATE, this._onTimeupdate)\n }\n\n _sendFF (endType) {\n this.s = now()\n const { isFFLoading, isFFSend } = this._state\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _sendFF`, `${endType} fvt:${this.fvt} isFFLoading:${isFFLoading} !isFFSend:${!isFFSend}`)\n if (this.vt > 0 && isFFLoading && !isFFSend) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} emitLog_firstFrame`, endType)\n this._state.isFFLoading = false\n this._state.isFFSend = true\n this.emitLog(LOG_TYPES.FIRST_FRAME, { fvt: this.fvt, costTime: this.fvt, vt: this.vt, startCostTime: this.startCostTime, loadedCostTime: this.loadedCostTime })\n }\n }\n\n _onTimeupdate = () => {\n this._state.isTimeUpdate = true\n if (this._state.autoplayStart) {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onTimeupdate`)\n this._sendFF('onTimeupdate')\n }\n }\n\n _onAutoplayStart = () => {\n XG_DEBUG.logInfo(`[xgLogger]${this.player.playerId} _onAutoplayStart`)\n this._state.autoplayStart = true\n this.vt && this._sendFF('onAutoplayStart')\n }\n\n _onReset = () => {\n this._state = {\n autoplayStart: false, // 是否已经自动起播\n isFFLoading: false, // LOAD_START是否已经触发\n isTimeUpdate: false, // 第一次timeupdate是否已经触发\n isFFSend: false, // 首帧事件是否已经触发\n isLs: false // loadstart是否已经发送\n }\n this.vt = 0\n this.pt = 0\n this.fvt = 0\n this.newPointTime = now()\n this.loadedCostTime = 0\n this.startCostTime = 0\n this._isSeeking = false\n this.seekingStart = 0\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this._isWaiting = false\n this._waitTimer && Util.clearTimeout(this, this._waitTimer)\n this._waittTimer && Util.clearTimeout(this, this._waittTimer)\n this._waitTimer = null\n this._waittTimer = null\n this._waitType = 0 // 0 - 普通卡顿 1-起播卡顿 2-seek卡顿\n }\n\n _onSeeking = () => {\n if (this.seekingStart) {\n return\n }\n this.suspendWaitingStatus('seek')\n this.seekingStart = now()\n this.emitLog(LOG_TYPES.SEEK_START, { start: now() })\n }\n\n _onSeeked = () => {\n this.suspendSeekingStatus('seeked')\n }\n\n _onWaitingLoadStart = () => {\n if (this._isWaiting || this.vt) {\n return\n }\n this._isWaiting = true\n this.waitingStart = now()\n this.fixedWaitingStart = now()\n this._waitType = 1\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: 1, endType: 'loadstart' })\n }\n\n _onWaiting = () => {\n // 普通卡顿起播之前不产生\n if (this._isWaiting || !this.vt) {\n return\n }\n // 卡顿标记开始\n this._isWaiting = true\n if (!this.vt) {\n this._waitType = 1\n } else if (this.seekingStart) {\n this._waitType = 2\n } else {\n this._waitType = 0\n }\n // 原始卡顿耗时起始时间\n this.fixedWaitingStart = now()\n this._waitTimer = Util.setTimeout(this, () => {\n if (this._isWaiting) {\n this.waitingStart = now()\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n this._startWaitTimeout()\n this.emitLog(LOG_TYPES.WAIT_START, { fixedStart: this.fixedWaitingStart, start: this.waitingStart, type: this._waitType, endType: this._waitType === 2 ? 'seek' : 'playing' })\n }\n }, 200)\n }\n\n _onError = () => {\n this.suspendSeekingStatus('error')\n this.suspendWaitingStatus('error')\n }\n\n _startWaitTimeout () {\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n }\n this._waittTimer = Util.setTimeout(this, () => {\n this.suspendWaitingStatus('timeout')\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }, this.config.waitTimeout)\n }\n\n _onPlaying = () => {\n this._isWaiting && this.suspendWaitingStatus('playing')\n }\n\n endState (endType) {\n this.suspendWaitingStatus(endType)\n this.suspendSeekingStatus(endType)\n }\n\n suspendSeekingStatus (endType) {\n if (!this.seekingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.seekingStart\n this.seekingStart = 0\n this.emitLog(LOG_TYPES.SEEK_END, { end: _now, costTime: _cost, endType })\n }\n\n suspendWaitingStatus (endType) {\n if (this._waitTimer) {\n Util.clearTimeout(this, this._waitTimer)\n this._waitTimer = null\n }\n if (this._waittTimer) {\n Util.clearTimeout(this, this._waittTimer)\n this._waittTimer = null\n }\n this._isWaiting = false\n if (!this.waitingStart) {\n return\n }\n const _now = now()\n const _cost = _now - this.waitingStart\n const _fixedCost = _now - this.fixedWaitingStart\n const { waitTimeout } = this.config\n this._isWaiting = false\n this.waitingStart = 0\n this.fixedWaitingStart = 0\n this.emitLog(LOG_TYPES.WAIT_END, {\n fixedCostTime: _fixedCost > waitTimeout ? waitTimeout : _fixedCost,\n costTime: _cost > waitTimeout ? waitTimeout : _cost,\n type: endType === 'loadeddata' ? 1 : this._waitType,\n endType: this._waitType === 2 ? 'seek' : endType\n })\n }\n\n emitLog (eventType, data) {\n const { player } = this\n this.emit(Events.XGLOG, {\n t: now(),\n host: Util.getHostFromUrl(player.currentSrc),\n vtype: player.vtype,\n eventType,\n currentTime: this.player.currentTime,\n readyState: player.video.readyState,\n networkState: player.video.networkState,\n ...data\n })\n }\n}\nexport {\n LOG_TYPES,\n XGLogger as default\n}\n","import Plugin, { Events, Util } from '../../plugin'\nimport ReplaySvg from '../assets/replay.svg'\nimport './index.scss'\n\nclass Replay extends Plugin {\n static get pluginName () {\n return 'replay'\n }\n\n static get defaultConfig () {\n return {\n disable: false\n }\n }\n\n registerIcons () {\n return {\n replay: ReplaySvg\n }\n }\n\n afterCreate () {\n Plugin.insert(this.icons.replay, this.root, 0)\n this.__handleReplay = this.hook('replayClick', () => {\n this.player.replay()\n }, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.bind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n // this.bind('svg', ['click', 'touchend'], this.__handleReplay)\n // this.bind('.xgplayer-replay-txt', ['click', 'touchend'], this.__handleReplay)\n\n this.on(Events.ENDED, () => {\n if (!this.playerConfig.loop) {\n Util.addClass(this.player.root, 'replay')\n }\n if (this.config.disable) {\n return\n }\n this.show()\n const path = this.root.querySelector('path')\n if (path) {\n const transform = window.getComputedStyle(path).getPropertyValue('transform')\n if (typeof transform === 'string' && transform.indexOf('none') > -1) {\n return null\n } else {\n path.setAttribute('transform', transform)\n }\n }\n })\n\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n\n handleReplay (e) {\n e.preventDefault()\n e.stopPropagation()\n this.player.replay()\n Util.removeClass(this.player.root, 'replay')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (this.config.disable) {\n return\n }\n this.root.style.display = 'flex'\n }\n\n enable () {\n this.config.disable = false\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n this.unbind('.xgplayer-replay', ['click', 'touchend'], this.__handleReplay)\n }\n\n render () {\n return `<xg-replay class=\"xgplayer-replay\">\n <xg-replay-txt class=\"xgplayer-replay-txt\" lang-key=\"${this.i18nKeys.REPLAY}\">${this.i18n.REPLAY}</xg-replay-txt>\n </xg-replay>`\n }\n}\nexport default Replay\n","import Plugin, { Events, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isEndedShow?: boolean, // 是否在播放结束之后显示\n * hideCanplay?: boolean, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n * poster?: string, // 封面图地址\n * useVideoPoster?: boolean // 是否使用video元素的poster属性设置封面(注意:原生poster填充方式固定为contain,fillMode不生效)\n * }} IPosterConfig\n */\nclass Poster extends Plugin {\n static get pluginName () {\n return 'poster'\n }\n\n /**\n * @type IPosterConfig\n */\n static get defaultConfig () {\n return {\n isEndedShow: true, // 是否在播放结束之后显示\n hideCanplay: false, // 设置为true时,播放后才隐藏,在视频地址更新后会重新显示poster。默认为false,即在play事件触发后隐藏poster\n notHidden: false, // 是否一直显示\n poster: '', // 封面图地址\n useVideoPoster: false, // 是否使用video元素的poster属性设置封面\n fillMode: 'fixWidth' // 封面图填充方式,fixWidth / fixHeight / cover / contain\n }\n }\n\n set isEndedShow (value) {\n this.config.isEndedShow = value\n }\n\n get isEndedShow () {\n return this.config.isEndedShow\n }\n\n hide () {\n if (!this.isHide) {\n if (!this.config.useVideoPoster) {\n Util.addClass(this.root, 'hide')\n }\n this.isHide = true\n }\n }\n\n /**\n * @returns\n */\n show () {\n this.isHide = false\n if (!this.config.useVideoPoster) {\n Util.removeClass(this.root, 'hide')\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.poster === 'string') {\n args.config.poster = args.player.config.poster\n }\n }\n\n afterCreate () {\n // 如果使用 video poster 属性,初始化时设置\n if (this.config.useVideoPoster && this.config.poster) {\n this.player.media.poster = this.config.poster\n }\n\n this.on(Events.ENDED, () => {\n if (this.isEndedShow) {\n this.show()\n }\n })\n\n this.on(Events.PLAYING, () => {\n this.hide()\n })\n\n if (this.config.hideCanplay) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n this.on(Events.URL_CHANGE, () => {\n this.show()\n if (!this.config.useVideoPoster) {\n Util.addClass(this.root, 'xg-showplay')\n }\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n })\n } else {\n this.on(Events.PLAY, () => {\n this.hide()\n })\n }\n }\n\n onTimeUpdate () {\n if (!this.player.currentTime) {\n this.once(Events.TIME_UPDATE, () => {\n this.onTimeUpdate()\n })\n } else {\n Util.removeClass(this.root, 'xg-showplay')\n }\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n this.config[key] = config[key]\n })\n const { poster } = this.config\n this.update(poster)\n }\n\n update (poster) {\n if (!poster) {\n return\n }\n this.config.poster = poster\n if (this.config.useVideoPoster) {\n this.player.media.poster = poster\n } else {\n this.root.style.backgroundImage = `url(${poster})`\n }\n }\n\n getBgSize (mode) {\n let _bg = ''\n switch (mode) {\n case 'cover':\n _bg = 'cover'\n break\n case 'contain':\n _bg = 'contain'\n break\n case 'fixHeight':\n _bg = 'auto 100%'\n break\n default:\n _bg = ''\n }\n return _bg ? `background-size: ${_bg};` : ''\n }\n\n render () {\n const { poster, hideCanplay, fillMode, notHidden, useVideoPoster } = this.config\n if (useVideoPoster) {\n return ''\n }\n const _bg = this.getBgSize(fillMode)\n const style = poster ? `background-image:url(${poster});${_bg}` : _bg\n const className = notHidden ? 'xg-not-hidden' : (hideCanplay ? 'xg-showplay' : '')\n return `<xg-poster class=\"xgplayer-poster ${className}\" style=\"${style}\">\n </xg-poster>`\n }\n}\n\nexport default Poster\n","import Plugin, { Util, Events, STATES } from '../../plugin'\nimport PlaySvg from '../assets/play.svg'\nimport PauseSvg from '../assets/pause.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * isShowPause?: boolean, // 暂停是否常驻\n * isShowEnd?: boolean, // 播放结束常驻\n * disableAnimate?: boolean, // 禁用点击动画\n * mode?: 'hide' | 'show' | 'auto' // 控制模式: hide 常驻: show 跟随:auto\n * [propName: string]: any\n * }} IStartConfig\n */\n\nconst AnimateMap = {}\nfunction addAnimate (key, seconds, callback = { start: null, end: null }) {\n if (AnimateMap[key]) {\n window.clearTimeout(AnimateMap[key].id)\n }\n AnimateMap[key] = {}\n callback.start && callback.start()\n AnimateMap[key].id = window.setTimeout(() => {\n callback.end && callback.end()\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n }, seconds)\n return AnimateMap[key].id\n}\n\nfunction clearAnimation (id) {\n if (id) {\n window.clearTimeout(id)\n return\n }\n Object.keys(AnimateMap).map(key => {\n window.clearTimeout(AnimateMap[key].id)\n delete AnimateMap[key]\n })\n}\n\n\nclass Start extends Plugin {\n static get pluginName () {\n return 'start'\n }\n\n /**\n * @type IStartConfig\n */\n static get defaultConfig () {\n return {\n isShowPause: false, // 暂停是否常驻\n isShowEnd: false, // 播放结束常驻\n disableAnimate: false, // 禁用点击动画\n mode: 'hide' // 控制模式: hide 常驻: show 跟随:auto\n }\n }\n\n constructor (args) {\n super(args)\n this.autoPlayStart = false\n }\n\n afterCreate () {\n const { playerConfig } = this\n\n this.initIcons()\n this.listenEvents()\n this.bindClickEvents()\n\n if (!playerConfig.autoplay) {\n this.show()\n }\n }\n\n /**\n * @public\n * This method can be overridden.\n */\n listenEvents () {\n const { player, playerConfig } = this\n\n this.once(Events.READY, () => {\n if (playerConfig) {\n if (playerConfig.lang && playerConfig.lang === 'en') {\n Util.addClass(player.root, 'lang-is-en')\n } else if (playerConfig.lang === 'jp') {\n Util.addClass(player.root, 'lang-is-jp')\n }\n }\n })\n\n this.on(Events.AUTOPLAY_STARTED, this.onAutoplayStart)\n\n this.on(Events.AUTOPLAY_PREVENTED, () => {\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n })\n\n this.on(Events.PLAY, () => {\n this.toggleTo('play')\n })\n\n this.on(Events.PAUSE, () => {\n this.toggleTo('pause')\n })\n\n this.on(Events.RESET, () => {\n this.onPlayerReset()\n })\n }\n\n /**\n * @public\n */\n bindClickEvents () {\n this.clickHandler = this.hook('startClick', this.switchPausePlay, {\n pre: (e) => {\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n const { paused } = this.player\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: paused, to: !paused })\n }\n })\n\n this.bind(['click', 'touchend'], this.clickHandler)\n }\n\n onPlayerReset = () => {\n this.autoPlayStart = false\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n this.setAttr('data-state', 'play')\n Util.removeClass(this.root, className)\n this.show()\n }\n\n onAutoplayStart = () => {\n if (this.autoPlayStart) {\n return\n }\n const className = this.config.mode === 'auto' ? 'auto-hide' : 'hide'\n Util.addClass(this.root, className)\n this.autoPlayStart = true\n this.toggleTo('play')\n }\n\n registerIcons () {\n return {\n startPlay: { icon: PlaySvg, class: 'xg-icon-play' },\n startPause: { icon: PauseSvg, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('xg-start-inner', icons.startPlay)\n this.appendChild('xg-start-inner', icons.startPause)\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n focusHide () {\n Util.addClass(this.root, 'focus-hide')\n }\n\n recover () {\n Util.removeClass(this.root, 'focus-hide')\n }\n\n switchStatus (isAnimate) {\n if (isAnimate) {\n this.setAttr('data-state', !this.player.paused ? 'play' : 'pause')\n } else {\n this.setAttr('data-state', this.player.paused ? 'play' : 'pause')\n }\n }\n\n animate (endShow) {\n this._animateId = addAnimate('pauseplay', 400, {\n start: () => {\n Util.addClass(this.root, 'interact')\n this.show()\n this.switchStatus(true)\n },\n end: () => {\n Util.removeClass(this.root, 'interact')\n !endShow && this.hide()\n this._animateId = null\n }\n })\n }\n\n endAnimate () {\n Util.removeClass(this.root, 'interact')\n clearAnimation(this._animateId)\n this._animateId = null\n }\n\n /**\n * @public\n */\n switchPausePlay (e) {\n const { player } = this\n e.cancelable && e.preventDefault()\n e.stopPropagation()\n if (player.state < STATES.READY) {\n return\n }\n const paused = this.player.paused\n if (!paused && player.state === STATES.RUNNING) {\n player.pause()\n } else {\n player.play()\n }\n }\n\n /**\n * @deprecated\n */\n onPlayPause (status) {\n this.toggleTo(status)\n }\n\n /**\n * @param {'play'|'pause'} status\n */\n toggleTo (status) {\n const { config, player } = this\n if (!player || player.state < STATES.RUNNING || !this.autoPlayStart) {\n return\n }\n // 一直显示\n if (config.mode === 'show') {\n this.switchStatus()\n this.show()\n return\n }\n\n // 跟随播放器的focus状态显示和隐藏\n if (config.mode === 'auto') {\n this.switchStatus()\n return\n }\n // 暂停/播放结束状态强制显示\n if ((config.isShowPause && player.paused && !player.ended) || (config.isShowEnd && player.ended)) {\n this.switchStatus()\n this.show()\n this.endAnimate()\n return\n }\n\n if (config.disableAnimate) {\n this.switchStatus()\n this.hide()\n return\n }\n\n if (status === 'play') {\n this.autoPlayStart ? this.animate() : this.hide()\n } else {\n if (!this.autoPlayStart || player.ended) {\n return\n }\n this.animate()\n }\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.clickHandler)\n clearAnimation(this._animateId)\n }\n\n render () {\n const className = this.playerConfig.autoplay ? (this.config.mode === 'auto' ? 'auto-hide' : 'hide') : ''\n return `\n <xg-start class=\"xgplayer-start ${className}\">\n <xg-start-inner></xg-start-inner>\n </xg-start>`\n }\n}\n\nexport default Start\n","import Plugin, { Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * @typedef { {\n * innerHtml?: string,\n * [propName: string]: any\n * } } IEnterConfig\n */\n\nclass Enter extends Plugin {\n static get pluginName () {\n return 'enter'\n }\n\n /**\n * @type IEnterConfig\n */\n static get defaultConfig () {\n return {\n innerHtml: '',\n logo: ''\n }\n }\n\n render () {\n const { innerHtml } = this.config\n const root = Util.createDom('xg-enter', '', {}, 'xgplayer-enter')\n\n if (innerHtml && innerHtml instanceof window.HTMLElement) {\n root.appendChild(innerHtml)\n } else if (innerHtml && typeof innerHtml === 'string') {\n root.innerHTML = innerHtml\n } else {\n let barStr = ''\n for (let i = 1; i <= 12; i++) {\n barStr += `<div class=\"xgplayer-enter-bar${i}\"></div>`\n }\n root.innerHTML = `<div class=\"xgplayer-enter-spinner\">${barStr}</div>`\n }\n return root\n }\n}\n\nexport default Enter\n","import Plugin, { POSITIONS } from '../../plugin'\n\nclass MiniScreenIcon extends Plugin {\n static get pluginName () {\n return 'miniscreenIcon'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 10\n }\n }\n\n afterCreate () {\n this.getMini = this.getMini.bind(this)\n this.exitMini = this.exitMini.bind(this)\n this.bind('click', this.getMini)\n }\n\n getMini () {\n this.config.onClick && this.config.onClick()\n }\n\n exitMini () {\n this.config.onClick && this.config.onClick()\n }\n\n destroy () {\n this.unbind(['click', 'touchend'], this.getMini)\n }\n\n render () {\n const langKey = 'MINISCREEN'\n return `\n <xg-icon class=\"xgplayer-miniicon\">\n <div class=\"xgplayer-icon btn-text\"><span class=\"icon-text\" lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span></div>\n </xg-icon>`\n }\n}\n\nexport default MiniScreenIcon\n","import EventEmitter from 'eventemitter3'\n\nfunction getStyleSize (value) {\n const num = parseFloat(value)\n // not a percent like '100%', and a number\n const isValid = value.indexOf('%') === -1 && !Number.isNaN(num)\n return isValid && num\n}\n\nconst measurements = [\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'paddingBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'marginBottom',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopWidth',\n 'borderBottomWidth'\n]\n\nconst measurementsLength = measurements.length\n\nfunction getZeroSize () {\n const size = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0\n }\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n size[measurement] = 0\n }\n return size\n}\n\nfunction getStyle (elem) {\n const style = window.getComputedStyle(elem)\n // if ( !style ) {\n // logError( 'Style returned ' + style +\n // '. Are you running this code in a hidden iframe on Firefox? ' +\n // 'See http://bit.ly/getsizebug1' );\n // }\n return style\n}\n\nfunction getSize (elem) {\n // use querySeletor if elem is string\n if (typeof elem === 'string') {\n elem = document.querySelector(elem)\n }\n\n // do not proceed on non-objects\n if (!elem || typeof elem !== 'object' || !elem.nodeType) {\n return\n }\n\n const style = getStyle(elem)\n\n // if hidden, everything is 0\n if (style.display === 'none') {\n return getZeroSize()\n }\n\n const size = {}\n size.width = elem.offsetWidth\n size.height = elem.offsetHeight\n\n const isBorderBox = size.isBorderBox = style.boxSizing === 'border-box'\n\n // get all measurements\n for (let i = 0; i < measurementsLength; i++) {\n const measurement = measurements[i]\n const value = style[measurement]\n const num = parseFloat(value)\n // any 'auto', 'medium' value will be 0\n size[measurement] = !Number.isNaN(num) ? num : 0\n }\n\n const paddingWidth = size.paddingLeft + size.paddingRight\n const paddingHeight = size.paddingTop + size.paddingBottom\n const marginWidth = size.marginLeft + size.marginRight\n const marginHeight = size.marginTop + size.marginBottom\n const borderWidth = size.borderLeftWidth + size.borderRightWidth\n const borderHeight = size.borderTopWidth + size.borderBottomWidth\n\n const isBorderBoxSizeOuter = isBorderBox// isBorderBox && isBoxSizeOuter;\n\n // overwrite width and height if we can get it from style\n const styleWidth = getStyleSize(style.width)\n if (styleWidth !== false) {\n size.width = styleWidth +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth)\n }\n\n const styleHeight = getStyleSize(style.height)\n if (styleHeight !== false) {\n size.height = styleHeight +\n // add padding and border unless it's already including it\n (isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight)\n }\n\n size.innerWidth = size.width - (paddingWidth + borderWidth)\n size.innerHeight = size.height - (paddingHeight + borderHeight)\n\n size.outerWidth = size.width + marginWidth\n size.outerHeight = size.height + marginHeight\n\n return size\n}\n\nfunction getTouch (touches, dentifier) {\n for (let i = 0; i < touches.length; i++) {\n const touch = touches[i]\n if (touch.identifier === dentifier) {\n return touch\n }\n }\n}\n\nconst EVENTS = {\n START: 'dragStart',\n MOVE: 'dragMove',\n ENDED: 'dragEnded'\n}\n\nconst POST_START_EVENTS = {\n mousedown: ['mousemove', 'mouseup'],\n touchstart: ['touchmove', 'touchend', 'touchcancel'],\n pointerdown: ['pointermove', 'pointerup', 'pointercancel']\n}\n\nexport default class Draggabilly extends EventEmitter {\n constructor (root, options = {}) {\n super()\n this.isEnabled = true\n this.isDragging = false\n this.isDown = false\n this.position = {}\n this.downPoint = {}\n this.dragPoint = { x: 0, y: 0 }\n this.startPos = { x: 0, y: 0 }\n // eslint-disable-next-line no-undef\n this._root = root instanceof Element ? root : document.querySelector(root)\n // eslint-disable-next-line no-undef\n this._handlerDom = options.handle instanceof Element ? options.handle : document.querySelector(options.handle)\n if (!this._root || !this._handlerDom) {\n return\n }\n // ['onDown', 'onUp', 'onMove', 'onCancel', 'onDocUp'].map(key => {\n // this[key] = this[key].bind(this)\n // })\n\n // if ('ontouchstart' in window) {\n // this._handlerKeys = TOUCH_HANDLERS\n // this._startKey = 'touchstart'\n // this._endKey = 'touchend'\n // } else {\n // this._handlerKeys = HANDLERS\n // this._startKey = 'mousedown'\n // this._endKey = 'mouseup'\n // }\n // this._handlerDom.addEventListener(this._startKey, this.onDown)\n this._bindStartEvent()\n }\n\n _bindStartEvent () {\n if ('ontouchstart' in window) {\n this._startKey = 'touchstart'\n } else {\n this._startKey = 'mousedown'\n }\n this[`on${this._startKey}`] = this[`on${this._startKey}`].bind(this)\n this._handlerDom.addEventListener(this._startKey, this[`on${this._startKey}`])\n POST_START_EVENTS[this._startKey].map(key => {\n this[`on${key}`] = this[`on${key}`].bind(this)\n })\n }\n\n _unbindStartEvent () {\n this._handlerDom.removeEventListener(this._startKey, this[`on${this._startKey}`])\n }\n\n _bindPostStartEvents (event) {\n if (!event) {\n return\n }\n const events = POST_START_EVENTS[this._startKey]\n // bind events to node\n events.map(eventName => {\n window.addEventListener(eventName, this[`on${eventName}`])\n })\n // save these arguments\n this._boundPointerEvents = events\n }\n\n _unbindPostStartEvents () {\n if (!this._boundPointerEvents) {\n return\n }\n this._boundPointerEvents.map(eventName => {\n // console.log('eventName', eventName, this[`on${eventName}`])\n window.removeEventListener(eventName, this[`on${eventName}`])\n })\n\n delete this._boundPointerEvents\n }\n\n enable () {\n this.isEnabled = true\n }\n\n disable () {\n this.isEnabled = false\n if (this.isDragging) {\n this.onUp()\n }\n }\n\n onDocUp (e) {\n this.onUp()\n }\n\n animate () {\n // only render and animate if dragging\n if (!this.isDragging) {\n return\n }\n\n this.positionDrag()\n\n window.requestAnimationFrame(() => {\n this.animate()\n })\n }\n\n positionDrag () {\n // this._root.style.transform = 'translate3d( ' + this.dragPoint.x +\n // 'px, ' + this.dragPoint.y + 'px, 0)';\n const transform = `translate3d(${this.dragPoint.x}px, ${this.dragPoint.y}px, 0)`\n this._root.style.transform = transform\n this._root.style.webKitTransform = transform\n }\n\n setLeftTop () {\n this._root.style.left = this.position.x + 'px'\n this._root.style.top = this.position.y + 'px'\n }\n\n onmousedown (e) {\n this.dragStart(e, e)\n }\n\n onmousemove (e) {\n this.dragMove(e, e)\n }\n\n onmouseup (e) {\n this.dragEnd(e, e)\n }\n\n ontouchstart (e) {\n const touch = e.changedTouches[0]\n this.dragStart(e, touch)\n this.touchIdentifier = touch.pointerId !== undefined\n ? touch.pointerId\n : touch.identifier\n e.preventDefault()\n }\n\n ontouchmove (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragMove(e, touch)\n }\n }\n\n ontouchend (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragEnd(e, touch)\n }\n e.preventDefault()\n }\n\n ontouchcancel (e) {\n const touch = getTouch(e.changedTouches, this.touchIdentifier)\n if (touch) {\n this.dragCancel(e, touch)\n }\n }\n\n dragStart (e, pointer) {\n if (!this._root || this.isDown || !this.isEnabled) {\n return\n }\n this.downPoint = pointer\n this.dragPoint.x = 0\n this.dragPoint.y = 0\n\n this._getPosition()\n\n const size = getSize(this._root)\n\n this.startPos.x = this.position.x\n this.startPos.y = this.position.y\n this.startPos.maxY = window.innerHeight - size.height\n this.startPos.maxX = window.innerWidth - size.width\n this.setLeftTop()\n\n this.isDown = true\n this._bindPostStartEvents(e)\n }\n\n dragRealStart (e, pointer) {\n this.isDragging = true\n this.animate()\n this.emit(EVENTS.START, this.startPos)\n }\n\n dragEnd (e, pointer) {\n if (!this._root) {\n return\n }\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this._root.style.transform = ''\n this.setLeftTop()\n this.emit(EVENTS.ENDED)\n }\n this.presetInfo()\n }\n\n _dragPointerMove (e, pointer) {\n const moveVector = {\n x: pointer.pageX - this.downPoint.pageX,\n y: pointer.pageY - this.downPoint.pageY\n }\n // 检测是否有移动\n if (!this.isDragging && this.hasDragStarted(moveVector)) {\n this.dragRealStart(e, pointer)\n }\n return moveVector\n }\n\n dragMove (e, pointer) {\n e = e || window.event\n if (!this.isDown) {\n return\n }\n const { x, y } = this.startPos\n const moveVector = this._dragPointerMove(e, pointer)\n let dragX = moveVector.x\n let dragY = moveVector.y\n dragX = this.checkContain('x', dragX, x)\n dragY = this.checkContain('y', dragY, y)\n this.position.x = x + dragX\n this.position.y = y + dragY\n this.dragPoint.x = dragX\n this.dragPoint.y = dragY\n this.emit(EVENTS.MOVE, this.position)\n }\n\n dragCancel (e, pointer) {\n this.dragEnd(e, pointer)\n }\n\n presetInfo () {\n this.isDragging = false\n this.startPos = {\n x: 0,\n y: 0\n }\n this.dragPoint = {\n x: 0,\n y: 0\n }\n this.isDown = false\n }\n\n destroy () {\n this._unbindStartEvent()\n this._unbindPostStartEvents()\n if (this.isDragging) {\n this.dragEnd()\n }\n this.removeAllListeners()\n this._handlerDom = null\n }\n\n hasDragStarted (moveVector) {\n return Math.abs(moveVector.x) > 3 || Math.abs(moveVector.y) > 3\n }\n\n checkContain (axis, drag, grid) {\n if (drag + grid < 0) {\n return 0 - grid\n }\n\n if (axis === 'x' && drag + grid > this.startPos.maxX) {\n return this.startPos.maxX - grid\n }\n if (axis === 'y' && drag + grid > this.startPos.maxY) {\n return this.startPos.maxY - grid\n }\n return drag\n }\n\n _getPosition () {\n const style = window.getComputedStyle(this._root)\n const x = this._getPositionCoord(style.left, 'width')\n const y = this._getPositionCoord(style.top, 'height')\n // clean up 'auto' or other non-integer values\n this.position.x = Number.isNaN(x) ? 0 : x\n this.position.y = Number.isNaN(y) ? 0 : y\n\n this._addTransformPosition(style)\n }\n\n _addTransformPosition (style) {\n const transform = style.transform\n // bail out if value is 'none'\n if (transform.indexOf('matrix') !== 0) {\n return\n }\n // split matrix(1, 0, 0, 1, x, y)\n const matrixValues = transform.split(',')\n // translate X value is in 12th or 4th position\n const xIndex = transform.indexOf('matrix3d') === 0 ? 12 : 4\n const translateX = parseInt(matrixValues[xIndex], 10)\n // translate Y value is in 13th or 5th position\n const translateY = parseInt(matrixValues[xIndex + 1], 10)\n this.position.x += translateX\n this.position.y += translateY\n }\n\n _getPositionCoord (styleSide, measure) {\n if (styleSide.indexOf('%') !== -1) {\n // convert percent into pixel for Safari, #75\n const parentSize = getSize(this._root.parentNode)\n // prevent not-in-DOM element throwing bug, #131\n return !parentSize\n ? 0\n : (parseFloat(styleSide) / 100) * parentSize[measure]\n }\n return parseInt(styleSide, 10)\n }\n}\n","import Plugin, { Util, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport PlayIcon from '../assets/play.svg'\nimport PauseIcon from '../assets/pause.svg'\nimport MiniScreenIcon from './miniScreenIcon'\nimport Draggabilly from '../../utils/draggabilly'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disable?: boolean,\n * width?: number,\n * height?: number,\n * left?: number, // 默认左下角\n * top?: number, // 默认左下角\n * isShowIcon?: boolean, // 是否显示icon\n * isScrollSwitch?: boolean, // 滚动自动切换自动切换\n * scrollTop?: number, // 触发滚动的高度\n * disableDrag?: boolean, // 禁用拖拽\n * [propName: string]: any\n * }} IMiniScreenConfig\n */\nclass MiniScreen extends Plugin {\n static get pluginName () {\n return 'miniscreen'\n }\n\n /**\n * @type IMiniScreenConfig\n */\n static get defaultConfig () {\n return {\n index: 10,\n disable: false,\n width: 320,\n height: 180,\n left: -1, // Default bottom left corner\n top: -1, // Default bottom left corner\n isShowIcon: false, // Whether to show icon\n isScrollSwitch: false,\n scrollTop: 0, // Height to trigger scroll\n disableDrag: false // Disable drag and drop\n }\n }\n\n constructor (args) {\n super(args)\n this.isMini = false\n this.isClose = false\n const { config } = this\n this.pos = {\n left: config.left < 0 ? window.innerWidth - config.width - 20 : config.left,\n top: config.top < 0 ? window.innerHeight - config.height - 20 : config.top,\n height: this.config.height,\n width: this.config.width,\n scrollY: window.scrollY || 0\n }\n this.lastStyle = null\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.mini === 'boolean') {\n args.config.isShowIcon = args.player.config.mini\n }\n }\n\n afterCreate () {\n this.initIcons()\n this.on(Events.PAUSE, () => {\n this.setAttr('data-state', 'pause')\n })\n this.on(Events.PLAY, () => {\n this.setAttr('data-state', 'play')\n })\n }\n\n onPluginsReady () {\n const { player, config } = this\n if (config.disable) {\n return\n }\n if (this.config.isShowIcon) {\n const options = {\n config: {\n onClick: () => {\n this.getMini()\n }\n }\n }\n player.controls.registerPlugin(MiniScreenIcon, options, MiniScreenIcon.pluginName)\n }\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.bind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.bind('.play-icon', eventName, this.onCenterClick)\n if (!this.config.disableDrag) {\n this._draggabilly = new Draggabilly(this.player.root, {\n handle: this.root\n })\n }\n if (this.config.isScrollSwitch) {\n window.addEventListener('scroll', this.onScroll)\n }\n }\n\n registerIcons () {\n return {\n play: { icon: PlayIcon, class: 'xg-icon-play' },\n pause: { icon: PauseIcon, class: 'xg-icon-pause' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.play-icon', icons.play)\n this.appendChild('.play-icon', icons.pause)\n }\n\n onCancelClick = (e) => {\n // e.preventDefault()\n // e.stopPropagation()\n this.exitMini()\n this.isClose = true\n }\n\n onCenterClick = (e) => {\n const { player } = this\n player.paused ? player.play() : player.pause()\n }\n\n onScroll = (e) => {\n if ((!window.scrollY && window.scrollY !== 0) || Math.abs(window.scrollY - this.pos.scrollY) < 50) {\n return\n }\n let scrollHeight = parseInt(Util.getCss(this.player.root, 'height'))\n scrollHeight += this.config.scrollTop\n this.pos.scrollY = window.scrollY\n if (window.scrollY > scrollHeight + 5) {\n !this.isMini && !this.isClose && this.getMini()\n } else if (window.scrollY <= scrollHeight) {\n this.isMini && this.exitMini()\n this.isClose = false\n }\n }\n\n getMini () {\n if (this.isMini) {\n return\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n this.lastStyle = {}\n Util.addClass(player.root, 'xgplayer-mini');\n ['width', 'height', 'top', 'left'].map(key => {\n this.lastStyle[key] = target.style[key]\n target.style[key] = `${this.pos[key]}px`\n })\n if (playerConfig.fluid) {\n target.style['padding-top'] = ''\n }\n this.emit(Events.MINI_STATE_CHANGE, true)\n player.isMini = this.isMini = true\n }\n\n exitMini () {\n if (!this.isMini) {\n return false\n }\n const { player, playerConfig } = this\n const target = this.config.target || this.player.root\n Util.removeClass(player.root, 'xgplayer-mini')\n if (this.lastStyle) {\n Object.keys(this.lastStyle).map(key => {\n target.style[key] = this.lastStyle[key]\n })\n }\n this.lastStyle = null\n if (playerConfig.fluid) {\n player.root.style.width = '100%'\n player.root.style.height = '0'\n player.root.style['padding-top'] = `${playerConfig.height * 100 / playerConfig.width}%`\n }\n this.emit(Events.MINI_STATE_CHANGE, false)\n this.isMini = player.isMini = false\n }\n\n\n updatePos (pos) {\n this.pos = Object.assign(this.pos, pos)\n if (this.isMini) {\n this.player.root.style.left = `${this.pos.left}px`\n this.player.root.style.top = `${this.pos.top}px`\n this.player.root.style.width = `${this.pos.width}px`\n this.player.root.style.height = `${this.pos.height}px`\n }\n }\n\n destroy () {\n window.removeEventListener('scroll', this.onScroll)\n const eventName = Util.checkTouchSupport() ? 'touchend' : 'click'\n this.unbind('.mini-cancel-btn', eventName, this.onCancelClick)\n this.unbind('.play-icon', eventName, this.onCenterClick)\n this._draggabilly && this._draggabilly.destroy()\n this._draggabilly = null\n this.exitMini()\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-mini-layer class=\"xg-mini-layer\">\n <xg-mini-header class=\"xgplayer-mini-header\">\n ${xgIconTips(this, 'MINI_DRAG', this.playerConfig.isHideTips)}\n </xg-mini-header>\n <div class=\"mini-cancel-btn\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 20 20\">\n <path fill=\"#fff\" fill-rule=\"evenodd\" d=\"M3.99 3.49a1 1 0 0 1 1.414 0L10 8.085l4.596-4.595a1 1 0 1 1 1.414 1.414L11.414 9.5l4.596 4.596a1 1 0 0 1 .084 1.32l-.084.094a1 1 0 0 1-1.414 0L10 10.914 5.404 15.51a1 1 0 0 1-1.414-1.414L8.585 9.5 3.99 4.904a1 1 0 0 1-.084-1.32z\"></path>\n </svg>\n </div>\n <div class=\"play-icon\">\n </div>\n </xg-mini-layer>`\n }\n}\n\nexport {\n MiniScreen as default,\n MiniScreenIcon\n}\n","import { BasePlugin, Sniffer } from '../../plugin'\nimport { runHooks } from '../../plugin/hooksDescriptor'\nimport { LEAVE_PLAYER, ENTER_PLAYER } from '../../events'\nimport './index.scss'\n\nconst MOUSE_EVENTS = {\n mouseenter: 'onMouseEnter',\n mouseleave: 'onMouseLeave',\n mousemove: 'onMouseMove'\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nexport default class PCPlugin extends BasePlugin {\n static get pluginName () {\n return 'pc'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n afterCreate () {\n this._clickCount = 0\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { isMobileSimulateMode } = this.playerConfig\n if (isMobileSimulateMode === 'mobile' || (Sniffer.device === 'mobile' && !Sniffer.os.isIpad)) {\n return\n }\n this.initEvents()\n }\n\n initEvents () {\n const { media, root } = this.player\n const { enableContextmenu } = this.playerConfig\n\n root && root.addEventListener('click', this.onVideoClick, false)\n root && root.addEventListener('dblclick', this.onVideoDblClick, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.addEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n !enableContextmenu && media && media.addEventListener('contextmenu', this.onContextmenu, false)\n }\n\n /**\n * 检查Mobile插件是否正在处理touch事件,如果其正在处理touch事件,则不响应mouse事件\n * @returns {boolean}\n * @private\n */\n _isMobileTouchActive() {\n const mobilePlugin = this.player?.plugins?.mobile\n return !!mobilePlugin && mobilePlugin._isTouchActive === true\n }\n\n switchPlayPause (e) {\n const { player } = this\n this.emitUserAction(e, 'switch_play_pause', { props: 'paused', from: player.paused, to: !player.paused })\n if (!player.ended) {\n player.paused ? player.play() : player.pause()\n } else {\n player.duration !== Infinity && player.duration > 0 && player.replay()\n }\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseMove = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { player, playerConfig } = this\n if (!player.isActive) {\n player.focus({ autoHide: !playerConfig.closeDelayBlur })\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n }\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseEnter = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { playerConfig, player } = this\n !playerConfig.closeFocusVideoFocus && player.media.focus()\n if (playerConfig.closeDelayBlur) {\n player.focus({ autoHide: false })\n } else {\n player.focus()\n }\n this.emit(ENTER_PLAYER)\n }\n\n /**\n * @param {MouseEvent} e\n */\n onMouseLeave = (e) => {\n if (this._isMobileTouchActive()) {\n e?.stopImmediatePropagation()\n return\n }\n\n const { closePlayerBlur, leavePlayerTime, closeDelayBlur } = this.playerConfig\n if (!closePlayerBlur && !closeDelayBlur) {\n if (leavePlayerTime) {\n this.player.focus({ autoHide: true, delay: leavePlayerTime })\n } else {\n this.player.blur({ignorePaused: true})\n }\n }\n this.emit(LEAVE_PLAYER)\n }\n\n onContextmenu (e) {\n e = e || window.event\n if (e.preventDefault) {\n e.preventDefault()\n }\n if (e.stopPropagation) {\n e.stopPropagation()\n } else {\n e.returnValue = false // 解决IE8右键弹出\n e.cancelBubble = true\n }\n }\n\n onVideoClick = (e) => {\n const { player, playerConfig } = this\n if (e.target && playerConfig.closeVideoClick) {\n return\n }\n if (e.target === player.root || e.target === player.media || e.target === player.innerContainer || e.target === player.media.__canvas) {\n e.preventDefault()\n if (!playerConfig.closeVideoStopPropagation) {\n e.stopPropagation()\n }\n this._clickCount++\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n this.clickTimer = setTimeout(() => {\n if (!this._clickCount) {\n return\n }\n this._clickCount--\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.switchPlayPause(data.e)\n }, { e, paused: player.paused })\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }, 300)\n }\n }\n\n onVideoDblClick = (e) => {\n const { player, playerConfig } = this\n if (playerConfig.closeVideoDblclick || !e.target || (e.target !== player.media && e.target !== player.media.__canvas)) {\n return\n }\n if (!playerConfig.closeVideoClick && this._clickCount < 2) {\n this._clickCount = 0\n return\n }\n this._clickCount = 0\n if (this.clickTimer) {\n clearTimeout(this.clickTimer)\n this.clickTimer = null\n }\n e.preventDefault()\n e.stopPropagation()\n\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.emitUserAction(data.e, 'switch_fullscreen', { props: 'fullscreen', from: player.fullscreen, to: !player.fullscreen })\n player.fullscreen ? player.exitFullscreen() : player.getFullscreen()\n }, { e, fullscreen: player.fullscreen })\n }\n\n destroy () {\n const { video, root } = this.player\n this.clickTimer && clearTimeout(this.clickTimer)\n root.removeEventListener('click', this.onVideoClick, false)\n root.removeEventListener('dblclick', this.onVideoDblClick, false)\n video.removeEventListener('contextmenu', this.onContextmenu, false)\n Object.keys(MOUSE_EVENTS).map(item => {\n root.removeEventListener(item, this[MOUSE_EVENTS[item]], false)\n })\n }\n}\n","\nconst EVENTS = {\n PRESS: 'press',\n PRESS_END: 'pressend',\n DOUBlE_CLICK: 'doubleclick',\n CLICK: 'click',\n TOUCH_MOVE: 'touchmove',\n TOUCH_START: 'touchstart',\n TOUCH_END: 'touchend'\n}\n\nconst TOUCHS = {\n start: 'touchstart',\n end: 'touchend',\n move: 'touchmove',\n cancel: 'touchcancel'\n}\n\nconst MOUSES = {\n start: 'mousedown',\n end: 'mouseup',\n move: 'mousemove',\n cancel: 'mouseleave'\n}\n\nfunction getTouch (touches) {\n if (touches && touches.length > 0) {\n return touches[touches.length - 1]\n } else {\n return null\n }\n}\n\nfunction getDefaultConfig () {\n return {\n pressDelay: 600,\n dbClickDelay: 200,\n disablePress: false,\n disableDbClick: false,\n miniStep: 2,\n needPreventDefault: true\n }\n}\n\nclass Touche {\n constructor (dom, config = { eventType: 'touch' }) {\n this._pos = {\n moving: false,\n start: false,\n x: 0,\n y: 0\n }\n this.config = getDefaultConfig()\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n this.root = dom\n this.events = config.eventType === 'mouse' ? MOUSES : TOUCHS\n /**\n * @type { null | number}\n */\n this.pressIntrvalId = null\n /**\n * @type { null | number}\n */\n this.dbIntrvalId = null\n this.__handlers = {}\n this._initEvent()\n }\n\n _initEvent () {\n this.root.addEventListener(this.events.start, this.onTouchStart)\n }\n\n __setPress (e) {\n const { config } = this\n if (this.pressIntrvalId) {\n this.__clearPress()\n }\n this.pressIntrvalId = setTimeout(() => {\n this.trigger(EVENTS.PRESS, e)\n this._pos.press = true\n this.__clearPress()\n }, config.pressDelay)\n }\n\n __clearPress () {\n window.clearTimeout(this.pressIntrvalId)\n this.pressIntrvalId = null\n }\n\n __setDb (e) {\n const { config } = this\n if (this.dbIntrvalId) {\n this.__clearDb()\n this.trigger(EVENTS.DOUBlE_CLICK, e)\n return\n }\n this.dbIntrvalId = setTimeout(() => {\n this.__clearDb()\n if (!this._pos.start && !this._pos.press && !this._pos.moving) {\n this.trigger(EVENTS.CLICK, e)\n }\n }, config.dbClickDelay)\n }\n\n __clearDb () {\n clearTimeout(this.dbIntrvalId)\n this.dbIntrvalId = null\n }\n\n on (event, handler) {\n if (!this.__handlers[event]) {\n this.__handlers[event] = []\n }\n this.__handlers[event].push(handler)\n }\n\n off (event, handler) {\n if (!this.__handlers[event]) {\n return\n }\n const handlers = this.__handlers[event]\n let index = -1\n for (let i = 0; i < handlers.length; i++) {\n if (handlers[i] === handler) {\n index = i\n break\n }\n }\n if (index >= 0) {\n this.__handlers[event].splice(index, 1)\n }\n }\n\n trigger (event, e) {\n if (!this.__handlers[event]) {\n return\n }\n this.__handlers[event].map(handler => {\n try {\n handler(e)\n } catch (error) {\n console.error(`trigger>>:${event}`, error)\n }\n })\n }\n\n onTouchStart = (e) => {\n const { _pos, root } = this\n // config.needPreventDefault && preventToucheDefault(e)\n const touch = getTouch(e.touches)\n _pos.x = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.y = touch ? parseInt(touch.pageX, 10) : e.pageX\n _pos.start = true\n this.__setPress(e)\n root.addEventListener(this.events.end, this.onTouchEnd)\n root.addEventListener(this.events.cancel, this.onTouchCancel)\n root.addEventListener(this.events.move, this.onTouchMove)\n this.trigger(EVENTS.TOUCH_START, e)\n }\n\n onTouchCancel = (e) => {\n this.onTouchEnd(e)\n }\n\n onTouchEnd = (e) => {\n const { _pos, root } = this\n this.__clearPress()\n root.removeEventListener(this.events.cancel, this.onTouchCancel)\n root.removeEventListener(this.events.end, this.onTouchEnd)\n root.removeEventListener(this.events.move, this.onTouchMove)\n e.moving = _pos.moving\n e.press = _pos.press\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n this.trigger(EVENTS.TOUCH_END, e)\n !_pos.press && !_pos.moving && this.__setDb(e)\n _pos.press = false\n _pos.start = false\n _pos.moving = false\n }\n\n onTouchMove = (e) => {\n const { _pos, config } = this\n const touch = getTouch(e.touches)\n const x = touch ? parseInt(touch.pageX, 10) : e.pageX\n const y = touch ? parseInt(touch.pageY, 10) : e.pageX\n const diffx = x - _pos.x\n const diffy = y - _pos.y\n if (Math.abs(diffy) < config.miniStep && Math.abs(diffx) < config.miniStep) {\n return\n }\n this.__clearPress()\n _pos.press && this.trigger(EVENTS.PRESS_END, e)\n _pos.press = false\n _pos.moving = true\n this.trigger(EVENTS.TOUCH_MOVE, e)\n }\n\n destroy () {\n const map = {\n touchend: 'onTouchEnd',\n touchmove: 'onTouchMove',\n touchstart: 'onTouchStart'\n }\n Object.keys(map).forEach(key => {\n this.root.removeEventListener(key, this[map[key]])\n })\n }\n}\n\nexport default Touche\n\n","import Plugin, { Events, Util, Sniffer, STATES } from '../../plugin'\nimport Touche from './touch'\nimport SeekTipIcon from '../assets/seekicon.svg'\nimport { runHooks } from '../../plugin/hooksDescriptor'\n// import BackSvg from './back.svg'\nimport './index.scss'\n\n/**\n * @typedef {{\n * index?: number,\n * disableGesture?: boolean,\n * gestureX?: boolean,\n * gestureY?: boolean,\n * gradient?: 'normal' | 'none' | 'top' | 'bottom',\n * isTouchingSeek?: boolean,\n * miniMoveStep?: number,\n * miniYPer?: number,\n * scopeL?: number,\n * scopeR?: number,\n * pressRate?: number,\n * darkness?: boolean,\n * maxDarkness?: number,\n * disableActive?: boolean,\n * disableTimeProgress?: boolean,\n * hideControlsActive?: boolean,\n * hideControlsEnd?: boolean,\n * moveDuration?: number,\n * closedbClick?: boolean,\n * disablePress?: boolean,\n * disableSeekIcon?: boolean,\n * focusVideoClick?: boolean,\n * [propName: string]: any\n * }} IMobileConfig\n */\n\nconst ACTIONS = {\n AUTO: 'auto',\n SEEKING: 'seeking',\n PLAYBACK: 'playbackrate',\n LIGHT: ''\n}\n\nconst HOOKS = ['videoClick', 'videoDbClick']\n\nclass MobilePlugin extends Plugin {\n static get pluginName () {\n return 'mobile'\n }\n\n /**\n * @type IMobileConfig & { [propName: string]: any}\n */\n static get defaultConfig () {\n return {\n index: 0,\n disableGesture: false, // Whether to disable gestures\n gestureX: true, // Whether to enable horizontal gestures\n gestureY: true, // Whether to enable vertical gestures\n gradient: 'normal', // Gradient shadow, 'none'/'top'/'bottom'\n isTouchingSeek: false, // Whether to update currentTime at the same time as touchMove\n miniMoveStep: 5, // Minimum moving distance, used for move throttling\n miniYPer: 5, // Percentage of minimum displacement in y direction\n scopeL: 0.25, // Gesture range on the left\n scopeR: 0.25, // Gesture range on the right\n scopeM: 0.9, // Middle gesture range\n pressRate: 2, // playbackRate when long press\n darkness: true, // Whether to enable the dimming function on the left\n maxDarkness: 0.8, // Maximum darkness,maximum transparency of the mask\n disableActive: false, // Whether to disable the time prompt\n disableTimeProgress: false, // Whether to disable the time progress bar\n hideControlsActive: false, // Whether to hide the control bar when dragging by gesture\n hideControlsEnd: false, // Whether to hide the control bar when the gesture ended\n moveDuration: 60 * 6 * 1000, // The duration corresponding to the dragging width of the player\n closedbClick: false, // Whether to turn off the double tap gesture\n disablePress: true, // Whether to turn off the long press gesture\n disableSeekIcon: false, // Disable seek prompt\n focusVideoClick: false // Click on force toggle to pause/play\n }\n }\n\n constructor (options) {\n super(options)\n /**\n * @readonly\n */\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n time: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1\n }\n /**\n * @private\n */\n this.timer = null\n /**\n * 标记touch事件状态,供PC插件使用\n * @private\n */\n this._isTouchActive = false\n }\n\n get duration () {\n return this.playerConfig.customDuration || this.player.duration\n }\n\n get timeOffset () {\n return this.playerConfig.timeOffset || 0\n }\n\n registerIcons () {\n return {\n seekTipIcon: { icon: SeekTipIcon, class: 'xg-seek-pre' }\n }\n }\n\n afterCreate () {\n HOOKS.map(item => {\n this.__hooks[item] = null\n })\n const { playerConfig, config, player } = this\n if (playerConfig.closeVideoDblclick === true) {\n config.closedbClick = true\n }\n this.resetPos()\n if (!Util.isUndefined(playerConfig.disableGesture)) {\n config.disableGesture = !!playerConfig.disableGesture\n }\n this.appendChild('.xg-seek-icon', this.icons.seekTipIcon)\n\n this.xgMask = Util.createDom('xg-mask', '', {}, 'xgmask')\n player.root.appendChild(this.xgMask)\n\n this.initCustomStyle()\n\n this.registerThumbnail()\n\n const eventType = this.domEventType === 'mouse' ? 'mouse' : 'touch'\n this.touch = new Touche(this.root, { eventType, needPreventDefault: !this.config.disableGesture })\n\n this.root.addEventListener('contextmenu', e => {\n e.preventDefault()\n })\n\n /**\n * 对根节点做touchmove和touchend绑定,解决控制栏手势无作用的问题\n */\n player.root.addEventListener('touchmove', this.onRootTouchMove, true)\n player.root.addEventListener('touchend', this.onRootTouchEnd, true)\n player.root.addEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.addEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.addEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.addEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n this.on(Events.DURATION_CHANGE, () => {\n const { player, config } = this\n if (player.duration > 0 && player.duration * 1000 < config.moveDuration) {\n config.moveDuration = player.duration * 1000\n }\n })\n\n this.on([Events.CANPLAY, Events.ENDED], () => {\n const { time, isStart } = this.pos\n if (!isStart && time > 0) {\n this.pos.time = 0\n }\n })\n\n const eventsMap = {\n touchstart: 'onTouchStart',\n touchmove: 'onTouchMove',\n touchend: 'onTouchEnd',\n press: 'onPress',\n pressend: 'onPressEnd',\n click: 'onClick',\n doubleclick: 'onDbClick'\n }\n\n Object.keys(eventsMap).map(key => {\n this.touch.on(key, (e) => {\n this[eventsMap[key]](e)\n })\n })\n\n if (!config.disableActive) {\n // Add progress bar drag event callback\n const progressPlugin = player.plugins.progress\n if (progressPlugin) {\n progressPlugin.addCallBack('dragmove', (data) => {\n this.activeSeekNote(data.currentTime, data.forward)\n });\n ['dragend', 'click'].forEach(key => {\n progressPlugin.addCallBack(key, () => {\n this.changeAction(ACTIONS.AUTO)\n })\n })\n }\n }\n }\n\n registerThumbnail () {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail = thumbnail.createThumbnail(null, 'mobile-thumbnail')\n const timePreview = this.find('.time-preview')\n timePreview.insertBefore(this.thumbnail, timePreview.children[0])\n }\n }\n\n initCustomStyle () {\n const { commonStyle } = this.playerConfig || {}\n const { playedColor, progressColor, timePreviewStyle, curTimeColor, durationColor } = commonStyle\n if (playedColor) {\n this.find('.xg-curbar').style.backgroundColor = playedColor\n }\n if (progressColor) {\n this.find('.xg-bar').style.backgroundColor = progressColor\n }\n if (timePreviewStyle) {\n const previewDom = this.find('.time-preview')\n Object.keys(timePreviewStyle).forEach(key => {\n previewDom.style[key] = timePreviewStyle[key]\n })\n }\n const curColor = curTimeColor || playedColor\n const durColor = durationColor\n curColor && (this.find('.xg-cur').style.color = curColor)\n durColor && (this.find('.xg-dur').style.color = durColor)\n this.config.disableTimeProgress && Util.addClass(this.find('.xg-timebar'), 'hide')\n }\n\n resetPos (time = 0) {\n if (this.pos) {\n this.pos.isStart = false\n this.pos.scope = -1;\n ['x', 'y', 'width', 'height', 'scopeL', 'scopeR', 'scopeM1', 'scopeM2'].map(item => {\n this.pos[item] = 0\n })\n } else {\n this.pos = {\n isStart: false,\n x: 0,\n y: 0,\n volume: 0,\n rate: 1,\n light: 0,\n width: 0,\n height: 0,\n scopeL: 0,\n scopeR: 0,\n scopeM1: 0,\n scopeM2: 0,\n scope: -1,\n time: 0\n }\n }\n }\n\n changeAction (action) {\n const { player, root } = this\n root.setAttribute('data-xg-action', action)\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.recover()\n }\n\n getTouche (e) {\n const rotateDeg = this.player.rotateDeg\n const touche = e.touches && e.touches.length > 0 ? e.touches[e.touches.length - 1] : e\n // if (touches && touches.length > 0) {\n // const touche = touches[touches.length - 1]\n // if (rotateDeg === 0) {\n // return {\n // pageX: touche.pageX,\n // pageY: touche.pageY\n // }\n // } else {\n // return {\n // pageX: touche.pageY,\n // pageY: touche.pageX\n // }\n // }\n // } else {\n // }\n return rotateDeg === 0\n ? {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n : {\n pageX: touche.pageX,\n pageY: touche.pageY\n }\n }\n\n /**\n * 校验具体的操作范围\n * @param { number } x 方向位移\n * @param { number } y 方向位移\n * @param { number } diffx 方向位移差\n * @param { number } diffy 方向位移差\n * @param { any } pos 当前操作区域位置信息 包含{width, height}\n * @return { number } scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n */\n checkScope (x, y, diffx, diffy, pos) {\n const { width } = pos\n let scope = -1\n if (x < 0 || x > width) {\n return scope\n }\n const mold = diffy === 0 ? Math.abs(diffx) : Math.abs(diffx / diffy)\n if (Math.abs(diffx) > 0 && mold >= 1.73 && x > pos.scopeM1 && x < pos.scopeM2) {\n scope = 0\n } else if (Math.abs(diffx) === 0 || mold <= 0.57) {\n scope = x < pos.scopeL ? 1 : (x > pos.scopeR ? 2 : 3)\n }\n return scope\n }\n\n /**\n * 根据位移和操作类型进行对应处理\n * @param {number} diffx x方向位移差\n * @param {number} diffy y方向位移差\n * @param {number} scope scope 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} width 总体宽度\n * @param {number} height 总高度\n */\n executeMove (diffx, diffy, scope, width, height) {\n switch (scope) {\n case 0:\n this.updateTime(diffx / width * this.config.scopeM)\n break\n case 1:\n this.updateBrightness(diffy / height)\n break\n case 2:\n // ios系统不支持音量调节\n if (!Sniffer.os.isIos) {\n this.updateVolume(diffy / height)\n }\n break\n default:\n }\n }\n\n /**\n * 结束手势操作\n * @param {number} scope 当前手势类型 区域 0=>中间x方向滑动 1=>左侧上下滑动 2=>右侧上下滑动\n * @param {number} lastScope 上一次手势类型\n */\n endLastMove (lastScope) {\n const { pos, player, config } = this\n\n const time = (pos.time - this.timeOffset) / 1000\n switch (lastScope) {\n case 0:\n player.seek(Number(time).toFixed(1))\n config.hideControlsEnd ? player.blur() : player.focus()\n this.timer = setTimeout(() => {\n this.pos.time = 0\n }, 500)\n break\n case 1:\n case 2:\n default:\n }\n this.changeAction(ACTIONS.AUTO)\n }\n\n onTouchStart = (e) => {\n const { player, config, pos, playerConfig } = this\n const touche = this.getTouche(e)\n\n // 标记touch事件状态\n this._isTouchActive = true\n if (this.touchActiveTimer) {\n clearTimeout(this.touchActiveTimer)\n this.touchActiveTimer = null\n }\n\n if (touche && !config.disableGesture && this.duration > 0 && !player.ended) {\n pos.isStart = true\n this.timer && clearTimeout(this.timer)\n // e.cancelable && e.preventDefault()\n Util.checkIsFunction(playerConfig.disableSwipeHandler) && playerConfig.disableSwipeHandler()\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n // pos.volume = player.volume * 100\n const rect = this.root.getBoundingClientRect()\n if (player.rotateDeg === 90) {\n pos.top = rect.left\n pos.left = rect.top\n pos.width = rect.height\n pos.height = rect.width\n } else {\n pos.top = rect.top\n pos.left = rect.left\n pos.width = rect.width\n pos.height = rect.height\n }\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n pos.x = player.rotateDeg === 90 ? _y : _x // parseInt(touche.pageX - pos.left, 10)\n pos.y = player.rotateDeg === 90 ? _x : _y // parseInt(touche.pageY - pos.top, 10)\n pos.scopeL = config.scopeL * pos.width\n pos.scopeR = (1 - config.scopeR) * pos.width\n pos.scopeM1 = pos.width * (1 - config.scopeM) / 2\n pos.scopeM2 = pos.width - pos.scopeM1\n }\n }\n\n onTouchMove = (e) => {\n const touche = this.getTouche(e)\n const { pos, config, player } = this\n if (!touche || config.disableGesture || !this.duration || !pos.isStart) {\n return\n }\n const { miniMoveStep, hideControlsActive } = config\n\n const _x = parseInt(touche.pageX - pos.left, 10)\n const _y = parseInt(touche.pageY - pos.top, 10)\n\n const x = player.rotateDeg === 90 ? _y : _x\n const y = player.rotateDeg === 90 ? _x : _y\n\n if (Math.abs(x - pos.x) > miniMoveStep || Math.abs(y - pos.y) > miniMoveStep) {\n const diffx = x - pos.x\n const diffy = y - pos.y\n let scope = pos.scope\n if (scope === -1) {\n scope = this.checkScope(x, y, diffx, diffy, pos)\n // 手势为快进快退记录起始操作时间\n if (scope === 0) {\n !hideControlsActive ? player.focus({ autoHide: false }) : player.blur()\n !pos.time && (pos.time = parseInt(player.currentTime * 1000, 10) + this.timeOffset * 1000)\n }\n pos.scope = scope\n }\n if (scope === -1 || (scope > 0 && !config.gestureY) || (scope === 0 && !config.gestureX)) {\n return\n }\n // e.cancelable && e.preventDefault()\n this.executeMove(diffx, diffy, scope, pos.width, pos.height)\n pos.x = x\n pos.y = y\n } else {\n // console.log('touche.pageX - pos.x', touche.pageX - pos.x)\n }\n }\n\n onTouchEnd = (e) => {\n const { player, pos, playerConfig } = this\n\n // 延迟重置touch事件状态,确保后续的mouse事件被忽略\n if (this.touchActiveTimer) {\n clearTimeout(this.touchActiveTimer)\n }\n this.touchActiveTimer = setTimeout(() => {\n this._isTouchActive = false\n }, 10)\n\n setTimeout(() => {\n player.getPlugin('progress') && player.getPlugin('progress').resetSeekState()\n }, 10)\n if (!pos.isStart) {\n return\n }\n if (pos.scope > -1) {\n e.cancelable && e.preventDefault()\n }\n\n const { disableGesture, gestureX } = this.config\n if (!disableGesture && gestureX) {\n this.endLastMove(pos.scope)\n } else {\n pos.time = 0\n }\n pos.scope = -1\n this.resetPos()\n Util.checkIsFunction(playerConfig.enableSwipeHandler) && playerConfig.enableSwipeHandler()\n this.changeAction(ACTIONS.AUTO)\n }\n\n checkIsRootTarget (e) {\n const plugins = this.player.plugins || {}\n if (plugins.progress && plugins.progress.root.contains(e.target)) {\n return false\n }\n return (plugins.start && plugins.start.root.contains(e.target)) || (plugins.controls && plugins.controls.root.contains(e.target))\n }\n\n onRootTouchMove = (e) => {\n if (this.config.disableGesture || !this.config.gestureX) {\n return\n }\n if (this.checkIsRootTarget(e)) {\n e.stopPropagation()\n if (!this.pos.isStart) {\n this.onTouchStart(e)\n } else {\n this.onTouchMove(e)\n }\n }\n }\n\n onRootTouchEnd = (e) => {\n if (this.pos.scope > -1) {\n this.onTouchEnd(e)\n // const { controls } = this.player\n // controls && controls.recoverAutoHide()\n }\n }\n\n sendUseAction (event) {\n const { paused } = this.player\n this.emitUserAction(event, 'switch_play_pause', {\n prop: 'paused',\n from: paused,\n to: !paused\n })\n }\n\n clickHandler (e) {\n const { player, config, playerConfig } = this\n if (player.state < STATES.RUNNING) {\n if (!playerConfig.closeVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n player.play()\n }\n return\n }\n\n if (!config.closedbClick || playerConfig.closeVideoClick) {\n player.isActive ? player.blur() : player.focus()\n } else if (!playerConfig.closeVideoClick) {\n if (player.isActive || config.focusVideoClick) {\n this.sendUseAction(Util.createEvent('click'))\n this.switchPlayPause()\n }\n player.focus()\n }\n }\n\n dbClickHandler (e) {\n const { config, player } = this\n if (!config.closedbClick && player.state >= STATES.RUNNING) {\n this.sendUseAction(Util.createEvent('dblclick'))\n this.switchPlayPause()\n }\n }\n\n onClick (e) {\n const { player } = this\n runHooks(this, HOOKS[0], (plugin, data) => {\n this.clickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onDbClick (e) {\n const { player } = this\n runHooks(this, HOOKS[1], (plugin, data) => {\n this.dbClickHandler(data.e)\n }, { e, paused: player.paused })\n }\n\n onPress (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n pos.rate = this.player.playbackRate\n this.emitUserAction('press', 'change_rate', {\n prop: 'playbackRate',\n from: player.playbackRate,\n to: config.pressRate\n })\n player.playbackRate = config.pressRate\n this.changeAction(ACTIONS.PLAYBACK)\n }\n\n onPressEnd (e) {\n const { pos, config, player } = this\n if (config.disablePress) {\n return\n }\n this.emitUserAction('pressend', 'change_rate', { prop: 'playbackRate', from: player.playbackRate, to: pos.rate })\n player.playbackRate = pos.rate\n pos.rate = 1\n this.changeAction(ACTIONS.AUTO)\n }\n\n updateTime (percent) {\n const { player, config } = this\n const { duration } = this.player\n percent = Number(percent.toFixed(4))\n let time = parseInt(percent * config.moveDuration, 10) + this.timeOffset\n time += this.pos.time\n time = time < 0 ? 0 : (time > duration * 1000 ? duration * 1000 - 200 : time)\n player.getPlugin('time') && player.getPlugin('time').updateTime(time / 1000)\n player.getPlugin('progress') && player.getPlugin('progress').updatePercent(time / 1000 / this.duration, true)\n this.activeSeekNote(time / 1000, percent > 0)\n // 在滑动的同时实时seek\n if (config.isTouchingSeek) {\n // player.currentTime = time / 1000\n player.seek(Number((time - this.timeOffset) / 1000).toFixed(1))\n }\n this.pos.time = time\n }\n\n updateVolume (percent) {\n if (this.player.rotateDeg) {\n percent = -percent\n }\n const { player, pos } = this\n percent = parseInt(percent * 100, 10)\n pos.volume += percent\n if (Math.abs(pos.volume) < 10) {\n return\n }\n let volume = parseInt(player.volume * 10, 10) - parseInt(pos.volume / 10, 10)\n volume = volume > 10 ? 10 : (volume < 1 ? 0 : volume)\n player.volume = volume / 10\n pos.volume = 0\n }\n\n updateBrightness (percent) {\n const { pos, config, xgMask } = this\n if (!config.darkness) {\n return\n }\n if (this.player.rotateDeg) {\n percent = -percent\n }\n let light = pos.light + (0.8 * percent)\n light = light > config.maxDarkness ? config.maxDarkness : (light < 0 ? 0 : light)\n if (xgMask) {\n xgMask.style.backgroundColor = `rgba(0,0,0,${light})`\n }\n pos.light = light\n }\n\n activeSeekNote (time, isForward = true) {\n const { player, config } = this\n const isLive = !(this.duration !== Infinity && this.duration > 0)\n if (!time || typeof time !== 'number' || isLive || config.disableActive) {\n return\n }\n if (time < 0) {\n time = 0\n } else if (time > player.duration) {\n time = player.duration - 0.2\n }\n this.changeAction(ACTIONS.SEEKING)\n\n const startPlugin = player.plugins.start\n startPlugin && startPlugin.focusHide()\n\n this.find('.xg-dur').innerHTML = Util.format(this.duration)\n this.find('.xg-cur').innerHTML = Util.format(time)\n this.find('.xg-curbar').style.width = `${time / this.duration * 100}%`\n if (isForward) {\n Util.removeClass(this.find('.xg-seek-show'), 'xg-back')\n } else {\n Util.addClass(this.find('.xg-seek-show'), 'xg-back')\n }\n this.updateThumbnails(time)\n // const {thumbnail} = player.plugins\n // this.thumbnailPlugin && thumbnail.update(time)\n }\n\n updateThumbnails (time) {\n const { player } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, 160, 90)\n // this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n switchPlayPause () {\n const { player } = this\n if (player.state < STATES.ATTACHED) {\n return false\n } else if (!player.ended) {\n if (player.paused) {\n player.play()\n } else {\n player.pause()\n }\n }\n }\n\n // 动态禁用手势\n disableGesture () {\n this.config.disableGesture = true\n }\n\n // 动态启用手势\n enableGesture () {\n this.config.disableGesture = false\n }\n\n destroy () {\n const { player } = this\n this.timer && clearTimeout(this.timer)\n this.thumbnail = null\n player.root.removeChild(this.xgMask)\n this.xgMask = null\n this.touch && this.touch.destroy()\n this.touch = null\n player.root.removeEventListener('touchmove', this.onRootTouchMove, true)\n player.root.removeEventListener('touchend', this.onRootTouchEnd, true)\n player.root.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n const { controls } = this.player\n if (controls && controls.center) {\n controls.center.removeEventListener('touchmove', this.onRootTouchMove, true)\n controls.center.removeEventListener('touchend', this.onRootTouchEnd, true)\n controls.center.removeEventListener('touchcancel', this.onRootTouchEnd, true)\n }\n }\n\n render () {\n const className = this.config.gradient !== 'normal' ? `gradient ${this.config.gradient}` : 'gradient'\n return `\n <xg-trigger class=\"trigger\">\n <div class=\"${className}\"></div>\n <div class=\"time-preview\">\n <div class=\"xg-seek-show ${this.config.disableSeekIcon ? ' hide-seek-icon' : ''}\">\n <i class=\"xg-seek-icon\"></i>\n <span class=\"xg-cur\">00:00</span>\n <span class=\"xg-separator\">/</span>\n <span class=\"xg-dur\">00:00</span>\n </div>\n <div class=\"xg-bar xg-timebar\">\n <div class=\"xg-curbar\"></div>\n </div>\n </div>\n <div class=\"xg-playbackrate xg-top-note\">\n <span><i>${this.config.pressRate}X</i>${this.i18n.FORWARD}</span>\n </div>\n </xg-trigger>\n `\n }\n}\n\nexport default MobilePlugin\n","import { BasePlugin, Events, Util } from '../../plugin'\n\n/**\n * @typedef {{\n * seekStep?: number,\n * checkVisible?: boolean,\n * disableBodyTrigger?: boolean,\n * keyCodeMap?: { [propName: string]: any },\n * disable: boolean,\n * playbackRate: number,\n * isIgnoreUserActive: boolean,\n * [propName: string]: any\n * }} IKeyboardConfig\n */\n\nfunction preventDefault (e) {\n e.preventDefault()\n e.returnValue = false\n}\n\nfunction isDisableTag (el) {\n const tagName = el.tagName\n\n if (tagName === 'INPUT' || tagName === 'TEXTAREA' || el.isContentEditable) {\n return true\n }\n\n return false\n}\n\nclass Keyboard extends BasePlugin {\n static get pluginName () {\n return 'keyboard'\n }\n\n /**\n * @type IKeyboardConfig\n */\n static get defaultConfig () {\n return {\n seekStep: 10, // Left/right fast forward each operation time\n checkVisible: false, // Whether to check the visibility when the shortcut key takes effect\n disableBodyTrigger: false, // Whether to monitor the shortcut keys on the body\n disableRootTrigger: false, // 是否在player.root上做快捷键监听\n isGlobalTrigger: true, // Whether the shortcut key needs to be triggered globally\n keyCodeMap: {},\n disable: false,\n playbackRate: 2, // 长按倍速限制\n isIgnoreUserActive: true // 是否忽略用户激活状态\n }\n }\n\n mergekeyCodeMap () {\n const extendkeyCodeMap = this.config.keyCodeMap\n if (extendkeyCodeMap) {\n Object.keys(extendkeyCodeMap).map(key => {\n if (!this.keyCodeMap[key]) {\n this.keyCodeMap[key] = extendkeyCodeMap[key]\n } else {\n ['keyCode', 'action', 'disable', 'pressAction', 'disablePress', 'isBodyTarget'].map(key1 => {\n extendkeyCodeMap[key][key1] && (this.keyCodeMap[key][key1] = extendkeyCodeMap[key][key1])\n })\n }\n })\n }\n }\n\n afterCreate () {\n this.config.disable = !this.playerConfig.keyShortcut\n const seekStep = typeof this.config.seekStep === 'function' ? this.config.seekStep(this.player) : this.config.seekStep\n if (!(!seekStep || typeof seekStep !== 'number')) {\n this.seekStep = seekStep\n }\n this.keyCodeMap = {\n space: {\n keyCode: 32,\n action: 'playPause',\n disable: false,\n disablePress: false,\n noBodyTarget: false\n },\n up: {\n keyCode: 38,\n action: 'upVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n down: {\n keyCode: 40,\n action: 'downVolume',\n disable: false,\n disablePress: false,\n noBodyTarget: true\n },\n left: {\n keyCode: 37,\n action: 'seekBack',\n disablePress: false,\n disable: false\n },\n right: {\n keyCode: 39,\n action: 'seek',\n pressAction: 'changePlaybackRate',\n disablePress: false,\n disable: false\n },\n esc: {\n keyCode: 27,\n action: 'exitFullscreen',\n disablePress: true,\n disable: false\n }\n }\n this.mergekeyCodeMap()\n this._keyState = {\n isKeyDown: false,\n isBodyKeyDown: false,\n isPress: false,\n tt: 0,\n playbackRate: 0\n }\n this.player.root.addEventListener('keydown', this.onKeydown)\n document.addEventListener('keydown', this.onBodyKeyDown)\n }\n\n setConfig (newConfig) {\n Object.keys(newConfig).forEach(key => {\n this.config[key] = newConfig[key]\n })\n }\n\n checkIsVisible () {\n if (!this.config.checkVisible) {\n return true\n }\n const rec = this.player.root.getBoundingClientRect()\n const { height, top, bottom } = rec\n const h = window.innerHeight\n if ((top < 0 && top < 0 - height * 0.9) || (bottom > 0 && bottom - h > height * 0.9)) {\n return false\n }\n return true\n }\n\n checkCode (code, isBodyTarget) {\n let flag = false\n Object.keys(this.keyCodeMap).map(key => {\n if (this.keyCodeMap[key] && code === this.keyCodeMap[key].keyCode && !this.keyCodeMap[key].disable) {\n flag = !isBodyTarget || (isBodyTarget && !this.keyCodeMap[key].noBodyTarget)\n }\n })\n return flag\n }\n\n downVolume (event) {\n const { player } = this\n if (player.volume <= 0) {\n return\n }\n const val = parseFloat((player.volume - 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val >= 0) {\n player.volume = val\n } else {\n player.volume = 0\n }\n }\n\n upVolume (event) {\n const { player } = this\n if (player.volume >= 1) {\n return\n }\n const val = parseFloat((player.volume + 0.1).toFixed(1))\n const props = {\n volume: {\n from: player.volume,\n to: val\n }\n }\n this.emitUserAction(event, 'change_volume', { props })\n if (val <= 1) {\n player.volume = val\n } else {\n player.volume = 1\n }\n }\n\n seek (event) {\n const { currentTime, offsetCurrentTime, duration, offsetDuration, timeSegments } = this.player\n let _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n const _duration = offsetDuration || duration\n const _step = event.repeat && this.seekStep >= 4 ? parseInt(this.seekStep / 2, 10) : this.seekStep\n if (_time + _step <= _duration) {\n _time = _time + _step\n } else {\n _time = _duration\n }\n const _seekTime = Util.getCurrentTimeByOffset(_time, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n seekBack (event) {\n const { currentTime, offsetCurrentTime, timeSegments } = this.player\n const _step = event.repeat ? parseInt(this.seekStep / 2, 10) : this.seekStep\n const _time = offsetCurrentTime > -1 ? offsetCurrentTime : currentTime\n let _seekTime = _time - _step\n if (_seekTime < 0) {\n _seekTime = 0\n }\n _seekTime = Util.getCurrentTimeByOffset(_seekTime, timeSegments)\n const props = {\n currentTime: {\n from: currentTime,\n to: _seekTime\n }\n }\n this.emitUserAction(event, 'seek', { props })\n this.player.currentTime = _seekTime\n }\n\n changePlaybackRate (event) {\n const { _keyState, config, player } = this\n if (_keyState.playbackRate === 0) {\n _keyState.playbackRate = player.playbackRate\n player.playbackRate = config.playbackRate\n }\n }\n\n playPause (event) {\n const { player } = this\n if (!player) {\n return\n }\n this.emitUserAction(event, 'switch_play_pause')\n if (player.paused) {\n // eslint-disable-next-line handle-callback-err\n player.play()\n } else {\n player.pause()\n }\n }\n\n exitFullscreen (event) {\n const { player } = this\n const { fullscreen, cssfullscreen } = player\n if (fullscreen) {\n this.emitUserAction('keyup', 'switch_fullscreen', {\n prop: 'fullscreen',\n from: fullscreen,\n to: !fullscreen\n })\n player.exitFullscreen()\n }\n if (cssfullscreen) {\n this.emitUserAction('keyup', 'switch_css_fullscreen', {\n prop: 'cssfullscreen',\n from: cssfullscreen,\n to: !cssfullscreen\n })\n player.exitCssFullscreen()\n }\n }\n\n onBodyKeyDown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const keyCode = e.keyCode\n const { _keyState, player } = this\n const { disable, disableBodyTrigger, isIgnoreUserActive } = this.config\n // 以下条件不响应\n if (disable || disableBodyTrigger || !(player.isUserActive || isIgnoreUserActive) || isDisableTag(e.target) || !this.checkIsVisible() || e.metaKey || e.altKey || e.ctrlKey) {\n _keyState.isBodyKeyDown = false\n return\n }\n // 首次进入进行是否生效校验\n if (!event.repeat && !_keyState.isKeyDown) {\n if ((e.target === document.body || (this.config.isGlobalTrigger && !isDisableTag(e.target))) && this.checkCode(keyCode, true)) {\n _keyState.isBodyKeyDown = true\n }\n document.addEventListener('keyup', this.onBodyKeyUp)\n }\n _keyState.isBodyKeyDown && this.handleKeyDown(e)\n }\n\n onBodyKeyUp = (event) => {\n if (!this.player) {\n return\n }\n document.removeEventListener('keyup', this.onBodyKeyUp)\n this.handleKeyUp(event)\n }\n\n onKeydown = (event) => {\n if (!this.player) {\n return\n }\n const e = event || window.event\n const { _keyState } = this\n // 首次按下检查是否满足触发他条件\n if (!e.repeat) {\n if (this.config.disable || this.config.disableRootTrigger || e.metaKey || e.altKey || e.ctrlKey) {\n return\n }\n if (e && (e.keyCode === 37 || this.checkCode(e.keyCode)) && (e.target === this.player.root || e.target === this.player.video || e.target === this.player.controls.el)) {\n _keyState.isKeyDown = true\n }\n this.player.root.addEventListener('keyup', this.onKeyup)\n }\n // 长按不满足触发条件直接返回\n if (!_keyState.isKeyDown) {\n return\n }\n this.handleKeyDown(e)\n }\n\n onKeyup = (event) => {\n if (!this.player) {\n return\n }\n this.player.root.removeEventListener('keyup', this.onKeyup)\n this.handleKeyUp(event)\n }\n\n handleKeyDown (e) {\n const { _keyState } = this\n if (e.repeat) {\n _keyState.isPress = true\n const _t = Date.now()\n if (_t - _keyState.tt < 200) {\n return\n }\n _keyState.tt = _t\n }\n this.handleKeyCode(e.keyCode, e, _keyState.isPress)\n }\n\n handleKeyUp (e) {\n const { _keyState } = this\n if (_keyState.playbackRate > 0) {\n this.player.playbackRate = _keyState.playbackRate\n _keyState.playbackRate = 0\n }\n _keyState.isKeyDown = false\n _keyState.isPress = false\n _keyState.tt = 0\n }\n\n handleKeyCode (curKeyCode, event, isPress) {\n const arr = Object.keys(this.keyCodeMap)\n for (let i = 0; i < arr.length; i++) {\n const { action, keyCode, disable, pressAction, disablePress } = this.keyCodeMap[arr[i]]\n if (keyCode === curKeyCode) {\n if (!disable && !(isPress && disablePress)) {\n const _action = !isPress ? action : (pressAction || action)\n if (typeof _action === 'function') {\n action(event, this.player, isPress)\n } else if (typeof _action === 'string') {\n if (typeof this[_action] === 'function') {\n this[_action](event, this.player, isPress)\n }\n }\n this.emit(Events.SHORTCUT, {\n key: arr[i],\n target: event.target,\n isPress: isPress,\n ...this.keyCodeMap[arr[i]]\n })\n }\n preventDefault(event)\n event.stopPropagation()\n break\n }\n }\n }\n\n destroy () {\n this.player.root.removeEventListener('keydown', this.onKeydown)\n document.removeEventListener('keydown', this.onBodyKeyDown)\n this.player.root.removeEventListener('keyup', this.onKeyup)\n document.removeEventListener('keyup', this.onBodyKeyUp)\n }\n\n disable () {\n this.config.disable = true\n }\n\n enable () {\n this.config.disable = false\n }\n}\n\nexport default Keyboard\n","import Plugin, { POSITIONS } from '../../plugin/plugin'\nimport loadingIcon from '../assets/loading.svg'\nimport './index.scss'\n\nclass Loading extends Plugin {\n static get pluginName () {\n return 'loading'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.ROOT\n }\n }\n\n registerIcons () {\n return {\n loadingIcon: loadingIcon\n }\n }\n\n afterCreate () {\n this.appendChild('xg-loading-inner', this.icons.loadingIcon)\n }\n\n render () {\n return `\n <xg-loading class=\"xgplayer-loading\">\n <xg-loading-inner></xg-loading-inner>\n </xg-loading>`\n }\n}\n\nexport default Loading\n","import { BasePlugin, Events, Util } from '../../plugin'\n/**\n * 进行事件分段控制\n */\nexport default class TimeSegmentsControls extends BasePlugin {\n static get pluginName () {\n return 'TimeSegmentsControls'\n }\n\n static get defaultConfig () {\n return {\n disable: true,\n segments: []\n }\n }\n\n afterCreate () {\n this.curIndex = -1\n this.curPos = null\n this.lastCurrentTime = 0\n\n this.updateSegments()\n\n this.on(Events.DURATION_CHANGE, this._onDurationChange)\n this.on(Events.LOADED_DATA, this._onLoadedData)\n\n this.on(Events.TIME_UPDATE, this._onTimeupdate)\n\n this.on(Events.SEEKING, this._onSeeking)\n\n this.on(Events.PLAY, this._onPlay)\n }\n\n setConfig (newConfig) {\n if (!newConfig) {\n return\n }\n const keys = Object.keys(newConfig)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = newConfig[key]\n })\n this.updateSegments()\n }\n\n updateSegments () {\n const { disable, segments } = this.config\n const { player } = this\n if (disable || !segments || segments.length === 0) {\n player.timeSegments = []\n player.offsetDuration = 0\n player.offsetCurrentTime = -1\n } else {\n const _segs = this.formatTimeSegments(segments, player.duration)\n player.timeSegments = _segs\n player.offsetDuration = _segs.length > 0 ? _segs[_segs.length - 1].duration : 0\n }\n }\n\n formatTimeSegments (timeSegments, duration) {\n const ret = []\n if (!timeSegments) {\n return []\n }\n // console.log('>>>formatTimeSegments', duration)\n timeSegments.sort((a,b) =>{ return a.start - b.start })\n timeSegments.forEach((item, index) => {\n const _item = {}\n _item.start = item.start < 0 ? 0 : item.start\n _item.end = duration > 0 && item.end > duration ? duration : item.end\n if (duration > 0 && _item.start > duration) {\n return\n }\n ret.push(_item)\n const _segDuration = _item.end - _item.start\n if (index === 0) {\n _item.offset = item.start // 偏移量\n _item.cTime = 0\n _item.segDuration = _segDuration\n _item.duration = _segDuration\n } else {\n const last = ret[index - 1]\n _item.offset = last.offset + (_item.start - last.end)\n _item.cTime = last.duration + last.cTime\n _item.segDuration = _segDuration\n _item.duration = last.duration + _segDuration\n }\n })\n return ret\n }\n\n _onDurationChange = () => {\n this.updateSegments()\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const index = Util.getIndexByTime(currentTime,timeSegments)\n const time = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n this.player.offsetCurrentTime = time\n this.changeIndex(index, timeSegments)\n }\n\n _onLoadedData = () => {\n const { timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const time = Util.getOffsetCurrentTime(0, timeSegments)\n this.player.offsetCurrentTime = time\n this.changeIndex(0, timeSegments)\n if (this.curPos.start > 0){\n this.player.currentTime = this.curPos.start\n }\n }\n\n _onTimeupdate = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n const _len = timeSegments.length\n this.lastCurrentTime = currentTime\n const index = Util.getIndexByTime(currentTime, timeSegments)\n if (index !== this.curIndex) {\n this.changeIndex(index, timeSegments)\n }\n const curTime = Util.getOffsetCurrentTime(currentTime, timeSegments, index)\n\n this.player.offsetCurrentTime = curTime\n\n // 根据分段信息进行放时间点跳转\n if (!this.curPos) {\n return\n }\n const { start, end } = this.curPos\n if (currentTime < start) {\n this.player.currentTime = start\n } else if (currentTime > end && index >= _len - 1) {\n this.player.pause()\n }\n }\n\n _onSeeking = () => {\n const { currentTime, timeSegments } = this.player\n if (!this._checkIfEnabled(timeSegments)) {\n return\n }\n if (currentTime < timeSegments[0].start) {\n this.player.currentTime = timeSegments[0].start\n } else if (currentTime > timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[timeSegments.length - 1].end\n } else {\n const _index = Util.getIndexByTime(currentTime, timeSegments)\n if (_index >= 0) {\n const _seekTime = this.getSeekTime(currentTime, this.lastCurrentTime, _index, timeSegments)\n if (_seekTime >= 0 ) {\n this.player.currentTime = _seekTime\n }\n }\n }\n }\n\n _onPlay = () => {\n const { currentTime, timeSegments } = this.player\n if (this._checkIfEnabled(timeSegments) && currentTime >= timeSegments[timeSegments.length - 1].end) {\n this.player.currentTime = timeSegments[0].start\n }\n }\n\n getSeekTime (currentTime, lastCurrentTime, index, timeSegments) {\n let _time = -1\n const { start, end } = timeSegments[index]\n if (currentTime >= start && currentTime <= end) {\n // console.log('>>>>_onSeeking noSeek', currentTime, lastCurrentTime, start, end, _time)\n return _time\n }\n const diff = currentTime - lastCurrentTime\n if (diff < 0) {\n if (currentTime < start) {\n const diff2 = lastCurrentTime > start ? lastCurrentTime - start : 0\n _time = index - 1 >= 0 ? timeSegments[index - 1].end + diff + diff2 : 0\n // console.log('>>>>_onSeeking seek3', currentTime, lastCurrentTime, diff, start, end, _time)\n return _time\n }\n }\n return -1\n }\n\n _checkIfEnabled (segments) {\n return !(!segments || segments.length < 1)\n }\n\n changeIndex (index, timeSegments) {\n this.curIndex = index\n if (index >= 0 && timeSegments.length > 0) {\n this.curPos = timeSegments[index]\n } else {\n this.curPos = null\n }\n }\n}","import { POSITIONS, Util } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport { Events } from '../../plugin/basePlugin'\nimport RotateSvg from '../assets/rotate.svg'\nimport './index.scss'\n\nexport default class Rotate extends IconPlugin {\n static get pluginName () {\n return 'rotate'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n innerRotate: true, // true为只有画面旋转,false为整个播放器旋转\n clockwise: false,\n rotateDeg: 0, // 初始旋转角度\n disable: false\n }\n }\n\n constructor (args) {\n super(args)\n this.rotateDeg = this.config.rotateDeg || 0\n }\n\n afterCreate () {\n if (this.config.disable) {\n return\n }\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.rotate)\n this.onBtnClick = this.onBtnClick.bind(this)\n this._clickTimeStamp = 0\n this.bind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n // 全屏/css全屏/容器宽高发生变化 需要重新计算\n this.on(Events.VIDEO_RESIZE, () => {\n if (this.rotateDeg && this.config.innerRotate) {\n Util.setTimeout(this, () => {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }, 100)\n }\n })\n\n const root = this.player.root\n this.rootWidth = root.style.width || root.offsetWidth || root.clientWidth\n this.rootHeight = root.style.height || root.offsetHeight || root.clientHeight\n\n if (this.rotateDeg) {\n this.updateRotateDeg(this.rotateDeg, this.config.innerRotate)\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind('.xgplayer-icon', ['click', 'touchend'], this.onBtnClick)\n }\n\n onBtnClick (e) {\n const now = Date.now()\n if (now - this._clickTimeStamp < 300) {\n return\n }\n this._clickTimeStamp = now\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'rotate')\n this.rotate(this.config.clockwise, this.config.innerRotate, 1)\n }\n\n updateRotateDeg (rotateDeg, innerRotate) {\n if (!rotateDeg) {\n rotateDeg = 0\n }\n if (innerRotate) {\n this.player.videoRotateDeg = rotateDeg\n return\n }\n const { player, rootWidth, rootHeight } = this\n const { root, innerContainer } = player\n const video = player.media\n const width = root.offsetWidth\n const height = innerContainer && innerRotate ? innerContainer.offsetHeight : root.offsetHeight\n let rWidth = rootWidth\n let rHeight = rootHeight\n let x = 0\n let y = 0\n if (rotateDeg === 0.75 || rotateDeg === 0.25) {\n rWidth = `${height}px`\n rHeight = `${width}px`\n x = -(height - width) / 2\n y = -(width - height) / 2\n }\n const _transform = `translate(${x}px,${y}px) rotate(${rotateDeg}turn)`\n const _styles = {\n transformOrigin: 'center center',\n transform: _transform,\n webKitTransform: _transform,\n height: rHeight,\n width: rWidth\n }\n\n const _target = innerRotate ? video : root\n const poster = innerRotate ? player.getPlugin('poster') : null\n Object.keys(_styles).map(key => {\n _target.style[key] = _styles[key]\n poster && poster.root && (poster.root.style[key] = _styles[key])\n })\n }\n\n rotate (clockwise = false, innerRotate = true, times = 1) {\n const player = this.player\n if (!this.rotateDeg) {\n this.rotateDeg = 0\n }\n const factor = clockwise ? 1 : -1\n\n this.rotateDeg = (this.rotateDeg + 1 + factor * 0.25 * times) % 1\n this.updateRotateDeg(this.rotateDeg, innerRotate)\n player.emit(Events.ROTATE, this.rotateDeg * 360)\n }\n\n registerIcons () {\n return {\n rotate: RotateSvg\n }\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-rotate\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'ROTATE_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","/* global documentPictureInPicture */\nimport { Events, Util, POSITIONS } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport IconPlugin from '../common/iconPlugin'\nimport PipIcon from '../assets/pipIcon.svg'\nimport PipIconExit from '../assets/pipIconExit.svg'\nimport './index.scss'\n\n/**\n * @description picture-in-picture plugin\n * @doc https://www.w3.org/TR/picture-in-picture/\n * @doc https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n * @doc https://wicg.github.io/document-picture-in-picture/\n */\n\nconst PresentationMode = {\n PIP: 'picture-in-picture',\n INLINE: 'inline',\n FULLSCREEN: 'fullscreen'\n}\n\nclass PIP extends IconPlugin {\n static get pluginName () {\n return 'pip'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 6,\n showIcon: false,\n preferDocument: false,\n width: undefined,\n height: undefined,\n docPiPNode: undefined,\n docPiPStyle: undefined\n }\n }\n\n static checkWebkitSetPresentationMode (video) {\n return typeof video.webkitSetPresentationMode === 'function'\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.pip === 'boolean') {\n args.config.showIcon = args.player.config.pip\n }\n }\n\n afterCreate () {\n // 非可用状态不做初始化\n if (!this.isPIPAvailable()) {\n return\n }\n super.afterCreate()\n this.pMode = PresentationMode.INLINE\n this.initPipEvents()\n // 确认开启按钮的情况下才初始化按钮\n if (this.config.showIcon) {\n this.initIcons()\n }\n // video初始化之后再做判断是否显示\n this.once(Events.COMPLETE, () => {\n if (this.config.showIcon) {\n Util.removeClass(this.find('.xgplayer-icon'), 'xg-icon-disable')\n this.bind('click', this.switchPIP)\n }\n })\n }\n\n registerIcons () {\n return {\n pipIcon: { icon: PipIcon, class: 'xg-get-pip' },\n pipIconExit: { icon: PipIconExit, class: 'xg-exit-pip' }\n }\n }\n\n initIcons () {\n const { icons } = this\n this.appendChild('.xgplayer-icon', icons.pipIcon)\n this.appendChild('.xgplayer-icon', icons.pipIconExit)\n }\n\n initPipEvents () {\n const { player } = this\n this.leavePIPCallback = () => {\n // 处理点击x关闭画中画的时候暂停问题\n const paused = player.paused\n Util.setTimeout(this, () => {\n // 使用mediaPlay避免多次触发 playhooks\n !paused && player.mediaPlay()\n }, 0)\n !paused && player.mediaPlay()\n this.setAttr('data-state', 'normal')\n this.pipWindow = null\n player.emit(Events.PIP_CHANGE, false)\n }\n\n this.enterPIPCallback = (e) => {\n player.emit(Events.PIP_CHANGE, true)\n if (e?.pictureInPictureWindow) {\n this.pipWindow = e.pictureInPictureWindow\n }\n this.setAttr('data-state', 'pip')\n }\n\n this.onWebkitpresentationmodechanged = (e) => {\n const mode = player.media.webkitPresentationMode\n // 如果在全屏下进入了该逻辑,调用退出全屏处理\n if (this.pMode === PresentationMode.FULLSCREEN && mode !== PresentationMode.FULLSCREEN) {\n player.onFullscreenChange(null, false)\n }\n this.pMode = mode\n if (mode === PresentationMode.PIP) {\n this.enterPIPCallback(e)\n } else if (mode === PresentationMode.INLINE) {\n this.leavePIPCallback(e)\n }\n }\n\n if (player.media) {\n player.media.addEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.addEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.addEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n }\n }\n\n switchPIP = (e) => {\n if (!this.isPIPAvailable()) {\n return false\n }\n e.stopPropagation && e.stopPropagation()\n if (this.isPip) {\n this.exitPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: true, to: false })\n this.setAttr('data-state', 'normal')\n } else if (this.player.media.readyState === 4) {\n this.requestPIP()\n this.emitUserAction(e, 'change_pip', { props: 'pip', from: false, to: true })\n this.setAttr('data-state', 'pip')\n }\n }\n\n copyStyleIntoPiPWindow (pipWin) {\n const textContent = [...document.styleSheets]\n .map((style) => {\n try {\n return [...style.cssRules].map((rule) => rule.cssText).join('')\n } catch (e) {\n const link = document.createElement('link')\n link.rel = 'stylesheet'\n link.type = style.type\n link.media = style.media\n link.href = style.href\n pipWin.document.head.appendChild(link)\n }\n return ''\n })\n .filter(Boolean)\n .join('\\n')\n const style = document.createElement('style')\n\n style.textContent = textContent\n pipWin.document.head.appendChild(style)\n }\n\n /*\n * 进入画中画\n */\n requestPIP () {\n const { player, playerConfig, config } = this\n if (!this.isPIPAvailable() || this.isPip) {\n return\n }\n try {\n const { poster } = playerConfig\n if (poster) {\n player.media.poster = Util.typeOf(poster) === 'String' ? poster : poster.poster\n }\n\n if (config.preferDocument && this.isDocPIPAvailable()) {\n const pipOptions = {}\n\n if (config.width && config.height) {\n pipOptions.width = config.width\n pipOptions.height = config.height\n } else {\n const playerRect = player.root.getBoundingClientRect()\n pipOptions.width = playerRect.width\n pipOptions.height = playerRect.height\n }\n\n documentPictureInPicture.requestWindow(pipOptions).then((pipWin) => {\n const { docPiPNode, docPiPStyle } = config\n\n this.enterPIPCallback()\n\n // record original position\n const pipRoot = docPiPNode || player.root\n const parentNode = pipRoot.parentElement\n const previousSibling = pipRoot.previousSibling\n const nextSibling = pipRoot.nextSibling\n\n this.copyStyleIntoPiPWindow(pipWin)\n\n // Make sure player fits in the Picture-in-Picture window.\n const styles = document.createElement('style')\n styles.append('body{padding:0; margin:0;}')\n if (docPiPStyle) {\n let cssContent = ''\n if (typeof docPiPStyle === 'string') {\n cssContent = docPiPStyle\n } else if (typeof docPiPStyle === 'function') {\n cssContent = docPiPStyle.call(config)\n }\n if (cssContent) {\n styles.append(cssContent)\n }\n } else if (pipRoot === player.root) {\n styles.append(`\n .xgplayer{width: 100%!important; height: 100%!important;}\n `)\n }\n pipWin.document.head.append(styles)\n\n // Add player to the PiP window.\n pipWin.document.body.append(pipRoot)\n\n // Listen for the PiP closing event to put the video back.\n pipWin.addEventListener('pagehide', (event) => {\n player.plugins?.progress?.resetDragState?.()\n // Restore nodes to their original location\n if (parentNode) {\n if (nextSibling) {\n parentNode.insertBefore(pipRoot, nextSibling)\n } else if (previousSibling) {\n parentNode.insertBefore(pipRoot, previousSibling.nextSibling)\n } else {\n parentNode.appendChild(pipRoot)\n }\n } else {\n // console.log('无法找到原始父节点')\n }\n\n this.leavePIPCallback()\n }, { once: true })\n })\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('picture-in-picture')\n } else {\n player.media.requestPictureInPicture()\n }\n\n\n return true\n } catch (reason) {\n console.error('requestPiP', reason)\n return false\n }\n }\n\n /**\n * 退出画中画\n */\n exitPIP () {\n const { player } = this\n try {\n if (this.isPIPAvailable() && this.isPip) {\n if (this.isDocPIPAvailable() && documentPictureInPicture?.window) {\n documentPictureInPicture.window.close()\n } else if (PIP.checkWebkitSetPresentationMode(player.media)) {\n player.media.webkitSetPresentationMode('inline')\n } else {\n document.exitPictureInPicture()\n }\n }\n return true\n } catch (reason) {\n console.error('exitPIP', reason)\n return false\n }\n }\n\n /**\n * 处于画中画状态\n */\n get isPip () {\n const { player } = this\n return (\n !!(this.isDocPIPAvailable() && documentPictureInPicture?.window) ||\n (document.pictureInPictureElement &&\n document.pictureInPictureElement === player.media) ||\n player.media.webkitPresentationMode === PresentationMode.PIP\n )\n }\n\n isPIPAvailable () {\n const video = this.player.media\n const _isEnabled = Util.typeOf(document.pictureInPictureEnabled) === 'Boolean' ? document.pictureInPictureEnabled : false\n return _isEnabled &&\n ((Util.typeOf(video.disablePictureInPicture) === 'Boolean' && !video.disablePictureInPicture) ||\n (video.webkitSupportsPresentationMode && Util.typeOf(video.webkitSetPresentationMode) === 'Function')) ||\n this.isDocPIPAvailable()\n }\n\n isDocPIPAvailable () {\n return 'documentPictureInPicture' in window && /^(https|file)/.test(location.protocol)\n }\n\n destroy () {\n super.destroy()\n const { player } = this\n player.media.removeEventListener('enterpictureinpicture', this.enterPIPCallback)\n player.media.removeEventListener('leavepictureinpicture', this.leavePIPCallback)\n PIP.checkWebkitSetPresentationMode(player.media) && player.media.removeEventListener('webkitpresentationmodechanged', this.onWebkitpresentationmodechanged)\n this.exitPIP()\n this.unbind('click', this.btnClick)\n }\n\n render () {\n if (!this.config.showIcon || !this.isPIPAvailable()) {\n return\n }\n return `<xg-icon class=\"xgplayer-pip\">\n <div class=\"xgplayer-icon xg-icon-disable\">\n </div>\n ${xgIconTips(this, 'PIP', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\nexport default PIP\n","/**\n * 下一个按钮组件\n */\nimport Plugin, { POSITIONS, Sniffer, Events } from '../../plugin'\nimport { xgIconTips } from '../common/iconTools'\nimport Next from '../assets/playNext.svg'\nimport './index.scss'\n\nexport default class PlayNextIcon extends Plugin {\n static get pluginName () {\n return 'playNext'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_LEFT,\n index: 1,\n url: null,\n urlList: []\n }\n }\n\n constructor (options) {\n super(options)\n this.idx = -1\n }\n\n afterCreate () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.playNext)\n this.initEvents()\n }\n\n registerIcons () {\n return {\n playNext: Next\n }\n }\n\n initEvents () {\n this.nextHandler = this.hook('nextClick', this.changeSrc)\n const event = Sniffer.device === 'mobile' ? 'touchend' : 'click'\n this.bind(event, this.playNext)\n this.show()\n }\n\n playNext = (e) => {\n const { player } = this\n e.preventDefault()\n e.stopPropagation()\n if (this.idx + 1 < this.config.urlList.length) {\n this.idx++\n this.nextHandler(this.config.urlList[this.idx], this.idx)\n player.emit(Events.PLAYNEXT, this.idx + 1)\n } else {\n this.nextHandler()\n player.emit(Events.PLAYNEXT)\n }\n }\n\n changeSrc (url) {\n const { player } = this\n if (!url) {\n return\n }\n player.pause()\n player.currentTime = 0\n if (player.switchURL) {\n player.switchURL(url)\n } else {\n player.src = url\n }\n player.config.url = url\n player.play()\n }\n\n destroy () {\n this.unbind(['touchend', 'click'], this.playNext)\n }\n\n render () {\n if (!this.config.urlList || this.config.urlList.length === 0) {\n return\n }\n return `\n <xg-icon class=\"xgplayer-playnext\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'PLAYNEXT_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>\n `\n }\n}\n","// Refactored from download.js,to support custom request headers, cookies, etc.\n//\n// download.js copyright:\n// Copyright (c) 2013-2023 RNDme\n// https://github.com/rndme/download\n// MIT License\n// https://github.com/rndme/download/blob/master/LICENSE\n\nimport Sniffer from '../../utils/sniffer'\n\n/**\n * Enhanced saveAs function with authentication support\n * @typedef {Object} SaveAsOptions\n * @property {string} [fileName] - The name of the file to save\n * @property {string} [mimeType] - The MIME type of the file\n * @property {Object} [headers] - Custom headers for the request\n * @property {boolean} [withCredentials] - Whether to send cookies with the request\n * @property {number} [timeout] - Request timeout in milliseconds\n * @property {Function} [beforeRequest] - Function to call before the request is made\n */\n\n/**\n * Default configuration for saveAs\n */\nconst DEFAULT_CONFIG = {\n mimeType: 'application/octet-stream', // this default mime also triggers iframe downloads\n fileName: 'download',\n timeout: 30000\n}\n\n/**\n * Browser detection utilities\n */\nconst BrowserUtils = {\n /**\n * Check if the browser supports Blob\n */\n supportsBlob () {\n return typeof Blob !== 'undefined'\n },\n\n /**\n * Check if the browser supports URL.createObjectURL\n */\n supportsObjectURL () {\n return typeof URL !== 'undefined' && URL.createObjectURL\n },\n\n /**\n * Check if the browser is Safari\n */\n isSafari () {\n return Sniffer.browser === 'safari'\n },\n\n /**\n * Check if the browser is IE and supports msSaveBlob\n */\n isIEWithMsSaveBlob () {\n return navigator.msSaveBlob\n },\n\n /**\n * Check if the browser supports HTML5 download attribute\n */\n supportsDownloadAttribute () {\n const anchor = document.createElement('a')\n return 'download' in anchor\n }\n}\n\n/**\n * Data URL utilities\n */\nconst DataURLUtils = {\n /**\n * Check if a string is a data URL\n */\n isDataURL (str) {\n return /^data:([\\w+-]+\\/[\\w+.-]+)?[,;]/.test(str)\n },\n\n /**\n * Convert data URL to Blob\n */\n dataURLToBlob (dataURL) {\n const parts = dataURL.split(/[:;,]/)\n const type = parts[1]\n const indexDecoder = dataURL.indexOf('charset') > 0 ? 3 : 2\n const decoder = parts[indexDecoder] === 'base64' ? atob : decodeURIComponent\n const binData = decoder(parts.pop())\n const uiArr = new Uint8Array(binData.length)\n\n for (let i = 0; i < binData.length; i++) {\n uiArr[i] = binData.charCodeAt(i)\n }\n\n // Use compatible Blob constructor\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n return new BlobConstructor([uiArr], { type })\n },\n\n /**\n * Check if string contains non-ASCII characters\n */\n hasNonASCII (str) {\n return /([\\x80-\\xff])/.test(str)\n },\n\n /**\n * Convert string with non-ASCII characters to Uint8Array\n */\n stringToUint8Array (str) {\n const arr = new Uint8Array(str.length)\n for (let i = 0; i < str.length; i++) {\n arr[i] = str.charCodeAt(i)\n }\n return arr\n }\n}\n\n/**\n * File download utilities\n */\nconst DownloadUtils = {\n /**\n * Create and trigger download using HTML5 download attribute\n */\n downloadWithAnchor (url, fileName) {\n const anchor = document.createElement('a')\n anchor.href = url\n anchor.setAttribute('download', fileName)\n anchor.className = 'download-js-link'\n anchor.innerHTML = 'downloading...'\n anchor.style.display = 'none'\n\n // Add click event listener to prevent event bubbling\n const clickHandler = function (e) {\n e.stopPropagation()\n this.removeEventListener('click', clickHandler)\n }\n anchor.addEventListener('click', clickHandler)\n\n document.body.appendChild(anchor)\n\n setTimeout(() => {\n anchor.click()\n document.body.removeChild(anchor)\n // Clean up object URL after a short delay\n if (url.startsWith('blob:')) {\n setTimeout(() => URL.revokeObjectURL(url), 250)\n }\n }, 66)\n\n return true\n },\n\n /**\n * Handle Safari download (fallback method)\n */\n downloadWithSafari (url, fileName) {\n // Convert Blob to data URL if needed\n if (url instanceof Blob) {\n const reader = new FileReader()\n reader.onload = function (e) {\n const dataURL = e.target.result\n DownloadUtils.downloadWithSafari(dataURL, fileName)\n }\n reader.readAsDataURL(url)\n return true\n }\n\n if (DataURLUtils.isDataURL(url)) {\n url = 'data:' + url.replace(/^data:([\\w\\/\\-\\+]+)/, DEFAULT_CONFIG.mimeType)\n }\n\n if (!window.open(url)) {\n const confirmed = confirm(\n 'Displaying New Document\\n\\nUse Save As... to download, then click back to return to this page.'\n )\n if (confirmed) {\n location.href = url\n }\n }\n\n return true\n },\n\n /**\n * Download using iframe (legacy browsers)\n */\n downloadWithIframe (url, fileName) {\n // Convert Blob to data URL if needed\n if (url instanceof Blob) {\n const reader = new FileReader()\n reader.onload = function (e) {\n const dataURL = e.target.result\n DownloadUtils.downloadWithIframe(dataURL, fileName)\n }\n reader.readAsDataURL(url)\n return true\n }\n\n const iframe = document.createElement('iframe')\n document.body.appendChild(iframe)\n\n if (DataURLUtils.isDataURL(url)) {\n url = 'data:' + url.replace(/^data:([\\w\\/\\-\\+]+)/, DEFAULT_CONFIG.mimeType)\n }\n\n iframe.src = url\n setTimeout(() => document.body.removeChild(iframe), 333)\n\n return true\n }\n}\n\n/**\n * HTTP request utilities\n */\nconst RequestUtils = {\n /**\n * Create XMLHttpRequest with authentication support\n */\n createRequest (url, options = {}) {\n const xhr = new XMLHttpRequest()\n\n // Set timeout\n if (options.timeout) {\n xhr.timeout = options.timeout\n }\n\n // Set credentials\n if (typeof options.withCredentials === 'boolean') {\n xhr.withCredentials = options.withCredentials\n }\n\n return xhr\n },\n\n /**\n * Set custom headers on XMLHttpRequest\n */\n setHeaders (xhr, headers = {}) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value)\n })\n },\n\n /**\n * Download file from URL with authentication\n */\n downloadFromURL (url, fileName, options = {}) {\n return new Promise((resolve, reject) => {\n const xhr = RequestUtils.createRequest(url, options)\n\n xhr.open('GET', url, true)\n xhr.responseType = 'blob'\n\n // Set custom headers\n if (options.headers) {\n RequestUtils.setHeaders(xhr, options.headers)\n }\n\n if (options.withCredentials) {\n xhr.withCredentials = true\n }\n\n xhr.onload = function (e) {\n if (e.target.status === 200) {\n saveAs(e.target.response, fileName, options.mimeType || DEFAULT_CONFIG.mimeType)\n resolve(e.target.response)\n } else {\n reject(new Error(`HTTP ${e.target.status}: ${e.target.statusText}`))\n }\n }\n\n xhr.onerror = function () {\n reject(new Error('Network error occurred'))\n }\n\n xhr.ontimeout = function () {\n reject(new Error('Request timeout'))\n }\n\n if (options.beforeRequest) {\n options.beforeRequest(xhr)\n }\n\n // Use setTimeout to allow setting custom headers\n setTimeout(() => xhr.send(), 0)\n })\n }\n}\n\n/**\n * Main saveAs function\n * @param {string|Blob|ArrayBuffer} data - The data to save or URL to download\n * @param {string|SaveAsOptions} [fileNameOrOptions] - File name or options object\n * @param {string} [mimeType] - MIME type (used when fileNameOrOptions is string)\n * @returns {boolean|Promise} - Returns true for immediate downloads, Promise for async downloads\n */\nexport function saveAs (data, fileNameOrOptions, mimeType) {\n // Handle different parameter patterns\n let options = {}\n let fileName = DEFAULT_CONFIG.fileName\n let actualMimeType = DEFAULT_CONFIG.mimeType\n\n if (typeof fileNameOrOptions === 'string') {\n // Legacy API: saveAs(data, fileName, mimeType)\n fileName = fileNameOrOptions || DEFAULT_CONFIG.fileName\n actualMimeType = mimeType || DEFAULT_CONFIG.mimeType\n } else if (typeof fileNameOrOptions === 'object' && fileNameOrOptions !== null) {\n // New API: saveAs(data, options)\n options = { ...DEFAULT_CONFIG, ...fileNameOrOptions }\n fileName = options.fileName || DEFAULT_CONFIG.fileName\n actualMimeType = options.mimeType || DEFAULT_CONFIG.mimeType\n }\n\n // Handle reverse arguments pattern (legacy support)\n if (String(this) === 'true') {\n const temp = data\n data = fileNameOrOptions\n fileNameOrOptions = temp\n actualMimeType = mimeType || DEFAULT_CONFIG.mimeType\n }\n\n // Handle URL downloads\n if (typeof data === 'string' && !fileNameOrOptions && !mimeType && data.length < 2048) {\n const url = data\n const extractedFileName = url.split('/').pop().split('?')[0]\n fileName = extractedFileName || DEFAULT_CONFIG.fileName\n\n // Check if it's a valid URL\n const anchor = document.createElement('a')\n anchor.href = url\n if (anchor.href.indexOf(url) !== -1) {\n return RequestUtils.downloadFromURL(url, fileName, options)\n }\n }\n\n // Handle data URLs\n if (DataURLUtils.isDataURL(data)) {\n if (data.length > 1024 * 1024 * 1.999 && BrowserUtils.supportsBlob()) {\n const blob = DataURLUtils.dataURLToBlob(data)\n actualMimeType = blob.type || actualMimeType\n return saveAs(blob, fileName, actualMimeType)\n } else {\n return BrowserUtils.isIEWithMsSaveBlob()\n ? navigator.msSaveBlob(DataURLUtils.dataURLToBlob(data), fileName)\n : DownloadUtils.downloadWithAnchor(data, fileName)\n }\n }\n\n // Handle string data with non-ASCII characters\n if (typeof data === 'string' && DataURLUtils.hasNonASCII(data)) {\n const uint8Array = DataURLUtils.stringToUint8Array(data)\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n data = new BlobConstructor([uint8Array], { type: actualMimeType })\n }\n\n // Ensure data is a Blob with proper constructor fallback\n let blob\n if (data instanceof Blob) {\n blob = data\n } else {\n // Handle different Blob constructors for compatibility\n const BlobConstructor = window.Blob || window.MozBlob || window.WebKitBlob || function (parts, opts) {\n return parts\n }\n blob = new BlobConstructor([data], { type: actualMimeType })\n }\n\n // Handle IE with msSaveBlob\n if (BrowserUtils.isIEWithMsSaveBlob()) {\n return navigator.msSaveBlob(blob, fileName)\n }\n\n // Handle modern browsers with URL.createObjectURL\n if (BrowserUtils.supportsObjectURL()) {\n const objectURL = URL.createObjectURL(blob)\n return DownloadUtils.downloadWithAnchor(objectURL, fileName)\n }\n\n // Handle Safari fallback\n if (BrowserUtils.isSafari()) {\n return DownloadUtils.downloadWithSafari(blob, fileName)\n }\n\n // Handle browsers without URL support\n if (typeof blob === 'string' || blob.constructor === String) {\n try {\n const dataURL = 'data:' + actualMimeType + ';base64,' + btoa(blob)\n return DownloadUtils.downloadWithAnchor(dataURL, fileName)\n } catch (e) {\n const dataURL = 'data:' + actualMimeType + ',' + encodeURIComponent(blob)\n return DownloadUtils.downloadWithAnchor(dataURL, fileName)\n }\n }\n\n // Handle Blob without URL support using FileReader\n const reader = new FileReader()\n reader.onload = function (e) {\n DownloadUtils.downloadWithAnchor(e.target.result, fileName)\n }\n reader.readAsDataURL(blob)\n\n // Fallback to iframe for legacy browsers\n return DownloadUtils.downloadWithIframe(blob, fileName)\n}\n\n/**\n * Enhanced saveAs with authentication support\n * @param {string} url - URL to download from\n * @param {SaveAsOptions} options - Download options including authentication\n * @returns {Promise<Blob>} - Promise that resolves with the downloaded blob\n */\nexport function saveAsWithAuth (url, options = {}) {\n const config = { ...DEFAULT_CONFIG, ...options }\n const fileName = config.fileName || url.split('/').pop().split('?')[0] || 'download'\n\n return RequestUtils.downloadFromURL(url, fileName, config)\n}\n","import { POSITIONS, Util } from '../../plugin'\nimport DownloadSvg from '../assets/download.svg'\nimport IconPlugin from '../common/iconPlugin'\nimport { xgIconTips } from '../common/iconTools'\nimport { saveAsWithAuth } from './saveAs'\n\nimport './index.scss'\n\n/**\n * @typedef { {\n * position: string,\n * index: number,\n * disable: boolean,\n * saveAsOptions: import('./saveAs').SaveAsOptions,\n * [propName: string]: any\n * } } IDownloadConfig\n */\nexport default class Download extends IconPlugin {\n static get pluginName () {\n return 'download'\n }\n\n /**\n * @type IDownloadConfig\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n disable: true,\n saveAsOptions: {}\n }\n }\n\n constructor (args) {\n super(args)\n this.timer = null\n this.isLock = false\n }\n\n afterCreate () {\n super.afterCreate()\n if (this.config.disable) {\n return\n }\n this.appendChild('.xgplayer-icon', this.icons.download)\n this._handler = this.hook('click', this.download, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n this.bind(['click', 'touchend'], this._handler)\n }\n\n registerIcons () {\n return {\n download: DownloadSvg\n }\n }\n download = (e) => {\n if (this.isLock) {\n return\n }\n this.emitUserAction(e, 'download')\n const { url } = this.playerConfig\n let dUrl = ''\n if (Util.typeOf(url) === 'String') {\n dUrl = url\n } else if (Util.typeOf(url) === 'Array' && url.length > 0) {\n dUrl = url[0].src\n }\n const newUrl = this.getAbsoluteURL(dUrl)\n saveAsWithAuth(newUrl, Object.assign({}, this.config.saveAsOptions || {}))\n this.isLock = true\n this.timer = window.setTimeout(() => {\n this.isLock = false\n window.clearTimeout(this.timer)\n this.timer = null\n }, 300)\n }\n\n getAbsoluteURL (url) {\n // Check if absolute URL\n if (!url.match(/^https?:\\/\\//)) {\n const div = document.createElement('div')\n div.innerHTML = `<a href=\"${url}\">x</a>`\n url = div.firstChild.href\n }\n return url\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.download)\n window.clearTimeout(this.timer)\n this.timer = null\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n return `<xg-icon class=\"xgplayer-download\">\n <div class=\"xgplayer-icon\">\n </div>\n ${xgIconTips(this, 'DOWNLOAD_TIPS', this.playerConfig.isHideTips)}\n </xg-icon>`\n }\n}\n","import { POSITIONS, Events } from '../../plugin'\nimport IconPlugin from '../common/iconPlugin'\nimport './index.scss'\n\nexport default class ScreenShot extends IconPlugin {\n static get pluginName () {\n return 'screenShot'\n }\n\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 5,\n quality: 0.92,\n type: 'image/png',\n format: '.png',\n width: 600,\n height: 337,\n saveImg: true,\n fitVideo: true,\n disable: false,\n name: 'screenshot'\n }\n }\n\n beforeCreate (args) {\n if (typeof args.player.config.screenShot === 'boolean') {\n args.config.disable = !args.player.config.screenShot\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.appendChild('.xgplayer-icon', this.icons.screenshotIcon)\n const { config } = this\n this.initSize = (data) => {\n if (config.fitVideo) {\n config.width = data.vWidth\n config.height = data.vHeight\n }\n }\n this.once(Events.VIDEO_RESIZE, this.initSize)\n }\n\n onPluginsReady () {\n this.show()\n this.onClickBtn = this.onClickBtn.bind(this)\n this.bind(['click', 'touchend'], this.onClickBtn)\n }\n\n saveScreenShot (data, filename) {\n const saveLink = document.createElement('a')\n saveLink.href = data\n saveLink.download = filename\n\n let event\n try {\n if (typeof MouseEvent !== 'undefined') {\n event = new MouseEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window\n })\n } else {\n event = document.createEvent('MouseEvents')\n event.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)\n }\n } catch (e) {\n console.error('MouseEvent unsupported', e)\n }\n\n if (event) {\n saveLink.dispatchEvent(event)\n }\n }\n\n createCanvas (width, height) {\n const canvas = document.createElement('canvas')\n const canvasCtx = canvas.getContext('2d')\n\n this.canvasCtx = canvasCtx\n this.canvas = canvas\n\n canvas.width = width || this.config.width\n canvas.height = height || this.config.height\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingEnabled\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/imageSmoothingQuality\n canvasCtx.imageSmoothingEnabled = true\n if (canvasCtx.imageSmoothingEnabled) {\n canvasCtx.imageSmoothingQuality = 'high'\n }\n }\n\n onClickBtn (e) {\n e.preventDefault()\n e.stopPropagation()\n this.emitUserAction(e, 'shot')\n const { config } = this\n this.shot(config.width, config.height).then((data) => {\n this.emit(Events.SCREEN_SHOT, data)\n if (config.saveImg) {\n this.saveScreenShot(data, config.name + config.format)\n }\n })\n }\n\n shot (width, height, option = { quality: 0.92, type: 'image/png' }) {\n const { config, player } = this\n const quality = option.quality || config.quality\n const type = option.type || config.type\n return new Promise((resolve, reject) => {\n let canvas = null\n let canvasCtx\n\n if (player.media.canvas) {\n canvas = player.media.canvas\n } else {\n if (!this.canvas) {\n this.createCanvas(width, height)\n } else {\n this.canvas.width = width || config.width\n this.canvas.height = height || config.height\n }\n canvas = this.canvas\n canvasCtx = this.canvasCtx\n\n const mediaRatio = player.media.videoWidth / player.media.videoHeight\n const canvasRatio = canvas.width / canvas.height\n const sx = 0, sy = 0, sw = player.media.videoWidth, sh = player.media.videoHeight\n let dx, dy, dw, dh\n\n if (mediaRatio > canvasRatio) {\n dw = canvas.width\n dh = canvas.width / mediaRatio\n dx = 0\n dy = Math.round((canvas.height - dh) / 2)\n } else if (mediaRatio === canvasRatio) {\n dw = canvas.width\n dh = canvas.height\n dx = 0\n dy = 0\n } else if (mediaRatio < canvasRatio) {\n dw = canvas.height * mediaRatio\n dh = canvas.height\n dx = Math.round((canvas.width - dw) / 2)\n dy = 0\n }\n\n // https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/drawImage\n canvasCtx.drawImage(player.media, sx, sy, sw, sh, dx, dy, dw, dh)\n }\n let src = canvas.toDataURL(type, quality).replace(type, 'image/octet-stream')\n src = src.replace(/^data:image\\/[^;]+/, 'data:application/octet-stream')\n resolve(src)\n })\n }\n\n registerIcons () {\n return {\n screenshotIcon: null\n }\n }\n\n destroy () {\n super.destroy()\n this.unbind(['click', 'touchend'], this.onClickBtn)\n this.off(Events.VIDEO_RESIZE, this.initSize)\n }\n\n render () {\n if (this.config.disable) {\n return\n }\n const className = this.icons.screenshotIcon ? 'xgplayer-icon' : 'xgplayer-icon btn-text'\n const langKey = 'SCREENSHOT'\n return `\n <xg-icon class=\"xgplayer-shot\">\n <div class=\"${className}\">\n ${this.icons.screenshotIcon ? '' : `<span lang-key=\"${this.i18nKeys[langKey]}\">${this.i18n[langKey]}</span>`}\n </div>\n </xg-icon>`\n }\n}\n","import Plugin, { Util } from '../../plugin'\n\nexport default class OptionList {\n constructor (args) {\n this.config = args.config\n this.parent = args.root\n this.root = Util.createDom('ul', '', {}, `xg-options-list xg-list-slide-scroll ${this.config.className}`)\n args.root.appendChild(this.root)\n const { maxHeight } = this.config\n if (maxHeight) {\n this.setStyle({ maxHeight })\n }\n this.onItemClick = this.onItemClick.bind(this)\n this.renderItemList()\n const eventName = this.config.domEventType === 'touch' ? 'touchend' : 'click'\n this._delegates = Plugin.delegate.call(this, this.root, 'li', eventName, this.onItemClick)\n }\n\n renderItemList (data) {\n const { config, root } = this\n if (data) {\n config.data = data\n } else {\n data = config.data\n }\n\n if (config.style) {\n Object.keys(config.style).map(key => {\n root.style[key] = config[key]\n })\n }\n\n if (data.length > 0) {\n this.attrKeys = Object.keys(data[0])\n }\n\n this.root.innerHTML = ''\n\n data.map((item, index) => {\n const className = item.selected ? 'option-item selected' : 'option-item'\n item['data-index'] = index\n this.root.appendChild(Util.createDom('li', `<span>${item.showText}</span>`, item, className))\n })\n }\n\n onItemClick (e) {\n if (!e.delegateTarget) {\n e.delegateTarget = e.target\n }\n const target = e.delegateTarget\n if (target && Util.hasClass(target, 'selected')) {\n return false\n }\n const changeCallback = typeof this.config.onItemClick === 'function' ? this.config.onItemClick : null\n const curSelected = this.root.querySelector('.selected')\n Util.addClass(target, 'selected')\n curSelected && Util.removeClass(curSelected, 'selected')\n changeCallback(e, {\n from: curSelected ? this.getAttrObj(curSelected, this.attrKeys) : null,\n to: this.getAttrObj(target, this.attrKeys)\n })\n }\n\n getAttrObj (dom, keys) {\n if (!dom || !keys) {\n return {}\n }\n const obj = {}\n keys.map(key => {\n obj[key] = dom.getAttribute(key)\n })\n const index = dom.getAttribute('data-index')\n if (index) {\n obj.index = Number(index)\n }\n return obj\n }\n\n\n show () {\n Util.removeClass(this.root, 'hide')\n Util.addClass(this.root, 'active')\n }\n\n hide () {\n Util.removeClass(this.root, 'active')\n Util.addClass(this.root, 'hide')\n }\n\n setStyle (style) {\n Object.keys(style).forEach((key) => {\n this.root.style[key] = style[key]\n })\n }\n\n destroy () {\n if (this._delegates) {\n this._delegates.map(item => {\n item.destroy && item.destroy()\n })\n this._delegates = null\n }\n this.root.innerHTML = null\n this.parent.removeChild(this.root)\n this.root = null\n }\n}\n","\nimport Plugin, { Events, Util, Sniffer, POSITIONS } from '../../plugin'\nimport OptionList from './optionList'\n// import './optionsIcon.scss'\n\nconst LIST_TYPES = {\n SIDE: 'side',\n MIDDLE: 'middle',\n DEFAULT: 'default'\n}\n\nconst TOGGLE_MODES = {\n CLICK: 'click',\n HOVER: 'hover'\n}\n\nfunction getListClassName (listType, position) {\n if (listType === LIST_TYPES.SIDE) {\n return position === POSITIONS.CONTROLS_LEFT ? 'xg-side-list xg-left-side' : 'xg-side-list xg-right-side'\n } else {\n return ''\n }\n}\n\n/**\n * @typedef {{\n * isShow?: boolean,\n * index?: number,\n * list?: Array<any>,\n * listType?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IOptionsIconConfig\n */\n\nlet IS_MOBILE = Sniffer.device === 'mobile'\n\nexport default class OptionsIcon extends Plugin {\n static get pluginName () {\n return 'optionsIcon'\n }\n\n /**\n * @type { IOptionsIconConfig }\n */\n static get defaultConfig () {\n return {\n position: POSITIONS.CONTROLS_RIGHT,\n index: 100,\n list: [],\n listType: 'default', // 模式 side-右侧边栏 middle-中间显示\n listStyle: {},\n hidePortrait: true,\n isShowIcon: false,\n isItemClickHide: true, // 列表点击之后是否隐藏列表\n toggleMode: TOGGLE_MODES.HOVER, // 激活状态切换模式\n heightLimit: true\n }\n }\n\n constructor (args) {\n super(args)\n this.isIcons = false\n this.isActive = false\n this.curValue = null // 当前值\n this.curIndex = 0\n }\n\n updateLang (value) {\n this.renderItemList(this.config.list, this.curIndex)\n }\n\n afterCreate () {\n const { config } = this\n this.initIcons()\n IS_MOBILE = IS_MOBILE || this.domEventType === 'touch'\n if (IS_MOBILE && Sniffer.device === 'mobile' && config.listType === LIST_TYPES.DEFAULT) {\n config.listType = LIST_TYPES.SIDE\n }\n\n config.hidePortrait && Util.addClass(this.root, 'portrait')\n\n this.on([Events.VIDEO_RESIZE, Events.FULLSCREEN_CHANGE], () => {\n this._resizeList()\n })\n\n this.once(Events.CANPLAY, () => {\n if (config.list && config.list.length > 0) {\n this.renderItemList(config.list)\n this.show()\n }\n })\n // 移动端控制栏和列表互斥\n IS_MOBILE && this.on(Events.PLAYER_FOCUS, () => {\n if (!this.isActive) {\n return\n }\n this.optionsList && this.optionsList.hide()\n this.isActive = false\n })\n\n if (IS_MOBILE) {\n config.toggleMode = TOGGLE_MODES.CLICK\n this.activeEvent = 'touchend'\n } else {\n this.activeEvent = config.toggleMode === TOGGLE_MODES.CLICK ? 'click' : 'mouseenter'\n }\n\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.bind(this.activeEvent, this.switchActiveState)\n } else {\n this.bind(this.activeEvent, this.onEnter)\n this.bind('mouseleave', this.onLeave)\n }\n this.isIcons && this.bind('click', this.onIconClick)\n }\n\n initIcons () {\n const { icons } = this\n const _c = Object.keys(icons)\n let _isIcons = false\n if (_c.length > 0) {\n _c.forEach(key => {\n this.appendChild('.xgplayer-icon', icons[key])\n !_isIcons && (_isIcons = icons[key])\n })\n this.isIcons = _isIcons\n }\n if (_isIcons) {\n return\n }\n this.appendChild('.xgplayer-icon', Util.createDom('span', '', {}, 'icon-text'))\n Util.addClass(this.find('.xgplayer-icon'), 'btn-text')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2) {\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n }\n\n getTextByLang (item, key, lang) {\n if (item === undefined) {\n return ''\n }\n const { list } = this.config\n !lang && (lang = this.player.lang)\n key = (!key || Util.isUndefined(item[key])) ? 'text' : key\n typeof item === 'number' && (item = list[item])\n try {\n if (typeof item[key] === 'object') {\n return item[key][lang] || item[key].en\n } else {\n return item[key]\n }\n } catch (err) {\n console.warn(err)\n return ''\n }\n }\n\n onEnter = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseenter', {\n pluginName: this.pluginName\n })\n this.switchActiveState(e)\n }\n\n switchActiveState = (e) => {\n e.stopPropagation()\n const { toggleMode } = this.config\n if (toggleMode === TOGGLE_MODES.CLICK) {\n this.toggle(!this.isActive)\n } else {\n this.toggle(true)\n }\n }\n\n onLeave = (e) => {\n e.stopPropagation()\n this.emit('icon_mouseleave', {\n pluginName: this.pluginName\n })\n if (this.config.listType !== LIST_TYPES.SIDE) {\n this.isActive && this.toggle(false)\n }\n }\n\n onListEnter = (e) => {\n // console.log('onListEnter')\n this.enterType = 2\n }\n\n onListLeave = (e) => {\n // console.log('onListLeave', e.target)\n this.enterType = 0\n this.isActive && this.toggle(false)\n }\n\n // 状态切换\n toggle (isActive) {\n if (isActive === this.isActive || this.config.disable) return\n const { controls } = this.player\n const { listType } = this.config\n if (isActive) {\n listType === LIST_TYPES.SIDE ? controls.blur() : controls.focus()\n this.optionsList && this.optionsList.show()\n } else {\n listType === LIST_TYPES.SIDE ? controls.focus() : controls.focusAwhile()\n this.optionsList && this.optionsList.hide()\n }\n this.isActive = isActive\n }\n\n // 列表点击回调\n onItemClick (e, data) {\n e.stopPropagation()\n const { listType, list } = this.config\n this.curIndex = data.to.index\n this.curItem = list[this.curIndex]\n this.changeCurrentText()\n const { isItemClickHide } = this.config;\n (isItemClickHide || IS_MOBILE || listType === LIST_TYPES.SIDE) && this.toggle(false)\n }\n\n onIconClick (e) {\n //\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n if (!curItem) return\n this.find('.icon-text').innerHTML = this.getTextByLang(curItem, 'iconText')\n }\n\n renderItemList (itemList, curIndex) {\n const { config, optionsList, player } = this\n if (typeof curIndex === 'number') {\n this.curIndex = curIndex\n this.curItem = config.list[curIndex]\n }\n\n if (optionsList) {\n optionsList.renderItemList(itemList)\n this.changeCurrentText()\n return\n }\n\n const options = {\n config: {\n data: itemList || [],\n className: getListClassName(config.listType, config.position), // config.listType === LIST_TYPES.SIDE ? 'xg-right-side' : '',\n onItemClick: (e, data) => {\n this.onItemClick(e, data)\n },\n domEventType: IS_MOBILE ? 'touch' : 'mouse'\n },\n root: config.listType === LIST_TYPES.SIDE ? (player.innerContainer || player.root) : this.root\n }\n\n if (this.config.isShowIcon) {\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n if (_maxH && config.heightLimit) {\n options.config.maxHeight = `${_maxH}px`\n }\n this.optionsList = new OptionList(options)\n this.changeCurrentText()\n this.show()\n }\n this._resizeList()\n }\n\n _resizeList () {\n if (!this.config.heightLimit) {\n return\n }\n const { height } = this.player.root.getBoundingClientRect()\n const _maxH = this.config.listType === LIST_TYPES.MIDDLE ? height - 50 : height\n this.optionsList && this.optionsList.setStyle({ maxHeight: `${_maxH}px` })\n }\n\n destroy () {\n const { config } = this\n if (config.toggleMode === TOGGLE_MODES.CLICK) {\n this.unbind(this.activeEvent, this.switchActiveState)\n } else {\n this.unbind(this.activeEvent, this.onEnter)\n this.unbind('mouseleave', this.onLeave)\n }\n this.isIcons && this.unbind('click', this.onIconClick)\n if (this.optionsList) {\n this.optionsList.destroy()\n this.optionsList = null\n }\n }\n\n render () {\n if (!this.config.isShowIcon) {\n return\n }\n return `<xg-icon class=\"xg-options-icon ${this.config.className || ''}\">\n <div class=\"xgplayer-icon\">\n </div>\n </xg-icon>`\n }\n}\n","import { Events, POSITIONS, Util } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {import('../../defaultConfig').IDefinition} IDefinition\n */\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<IDefinition>,\n * defaultDefinition?: any,\n * disable?: any,\n * hidePortrait?: boolean,\n * className?: string\n * }} IDefinitionConfig\n */\nexport default class DefinitionIcon extends OptionsIcon {\n static get pluginName () {\n return 'definition'\n }\n\n /**\n * @type IDefinitionConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 3,\n list: [],\n defaultDefinition: '',\n disable: false,\n hidePortrait: false, // Whether to hide in the vertical screen state of the mobile terminal\n className: 'xgplayer-definition',\n isShowIcon: true\n }\n }\n\n beforeCreate (args) {\n const { list } = args.config\n if (Array.isArray(list) && list.length > 0) {\n args.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n }\n }\n\n constructor (args) {\n super(args)\n // 记录切换的时候的播放器状态\n this.curTime = 0\n this.isPaused = true\n }\n\n afterCreate () {\n super.afterCreate()\n this.on('resourceReady', (list) => {\n this.changeDefinitionList(list)\n })\n\n this.on(Events.DEFINITION_CHANGE, (data) => {\n this.renderItemList(this.config.list, data.to)\n })\n if (this.player.definitionList.length < 2) {\n this.hide()\n }\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length < 2){\n return\n }\n Util.addClass(this.root, 'show')\n }\n\n initDefinition () {\n const { list, defaultDefinition } = this.config\n if (list.length > 0) {\n let to = null\n list.map(item => {\n if (item.definition === defaultDefinition) {\n to = item\n }\n })\n if (!to) {\n to = list[0]\n }\n this.changeDefinition(to)\n }\n }\n\n renderItemList (list = this.config.list || [], to) {\n const targetDef = to && to.definition ? to.definition : this.config.defaultDefinition\n if (to) {\n list.forEach((item) => {\n item.selected = false\n })\n }\n let curIndex = 0\n const items = list.map((item, index) => {\n const showItem = {\n ...item,\n showText: this.getTextByLang(item) || item.definition,\n selected: false\n }\n\n if (item.selected || (item.definition\n // eslint-disable-next-line eqeqeq\n && item.definition == targetDef)\n ) {\n showItem.selected = true\n curIndex = index\n }\n return showItem\n })\n super.renderItemList(items, curIndex)\n }\n\n // 对外暴露 切换清晰度\n changeDefinitionList (list) {\n if (!Array.isArray(list)) {\n return\n }\n this.config.list = list.map(item => {\n if (!item.text && item.name) {\n item.text = item.name\n }\n if (!item.text) {\n item.text = item.definition\n }\n return item\n })\n this.renderItemList()\n this.config.list.length < 2 ? this.hide() : this.show()\n }\n\n changeDefinition (to, from) {\n this.player.changeDefinition(to, from)\n }\n\n onItemClick (e, data) {\n const { definitionList } = this.player\n super.onItemClick(...arguments)\n this.emitUserAction(e, 'change_definition', { from: data.from, to: data.to })\n for (let i = 0; i < definitionList.length; i++) {\n if (data.to && definitionList[i].definition === data.to.definition) {\n data.to.url = definitionList[i].url\n }\n\n if (data.from && (definitionList[i].definition === data.from.definition)) {\n data.from.url = definitionList[i].url\n }\n }\n this.player.changeDefinition(data.to, data.from)\n }\n}\n","import { Events, POSITIONS } from '../../plugin'\nimport OptionsIcon from '../common/optionsIcon'\nimport './index.scss'\n\n/**\n * @typedef {{\n * position?: string,\n * index?: number,\n * list?: Array<number | { [propName: string]: any }>,\n * className?: string,\n * hidePortrait?: boolean,\n * [propName: string]: any\n * }} IPlaybackRateConfig\n */\n\nexport default class PlaybackRate extends OptionsIcon {\n static get pluginName () {\n return 'playbackRate'\n }\n\n /**\n * @type IPlaybackRateConfig\n */\n static get defaultConfig () {\n return {\n ...OptionsIcon.defaultConfig,\n position: POSITIONS.CONTROLS_RIGHT,\n index: 4,\n list: [2, 1.5, 1, 0.75, 0.5],\n className: 'xgplayer-playbackrate',\n isShowIcon: true,\n hidePortrait: false\n }\n }\n\n constructor (args) {\n super(args)\n this.curRate = 1\n }\n\n beforeCreate (args) {\n const { playbackRate } = args.player.config\n const list = !playbackRate ? [] : Array.isArray(playbackRate) ? playbackRate : args.config.list\n if (Array.isArray(list)) {\n args.config.list = list.map(item => {\n if (typeof item === 'number') {\n item = {\n rate: item,\n text: `${item}x`\n }\n } else if (!item.text && item.rate) {\n item.text = `${item.rate}x`\n }\n return item\n })\n }\n }\n\n afterCreate () {\n super.afterCreate()\n this.on(Events.RATE_CHANGE, () => {\n if (this.curValue === this.player.playbackRate) {\n return\n }\n this.renderItemList()\n })\n this.renderItemList()\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n if (!this.config.list || this.config.list.length === 0) {\n return\n }\n super.show()\n }\n\n onItemClick (e, _data) {\n super.onItemClick(e, _data)\n const target = e.delegateTarget\n const rate = Number(target.getAttribute('rate'))\n if (!rate || rate === this.curValue) {\n return false\n }\n const props = {\n playbackRate: {\n from: this.player.playbackRate,\n to: rate\n }\n }\n this.emitUserAction(e, 'change_rate', { props })\n this.curValue = rate\n this.player.playbackRate = rate\n }\n\n renderItemList () {\n const playbackRate = this.player.playbackRate || 1\n this.curValue = playbackRate\n let curIndex = -1\n const items = this.config.list.map((item, index) => {\n const itemInfo = {\n rate: item.rate\n }\n if (itemInfo.rate === playbackRate) {\n itemInfo.selected = true\n curIndex = index\n }\n itemInfo.showText = this.getTextByLang(item)\n return itemInfo\n })\n super.renderItemList(items, curIndex)\n }\n\n changeCurrentText () {\n if (this.isIcons) {\n return\n }\n const { list } = this.config\n const index = this.curIndex < list.length ? this.curIndex : 0\n const curItem = list[index]\n let _text = ''\n // 在列表中没有匹配的选项的时候,默认展示`${playbackRate}x'\n if (!curItem || this.curIndex < 0) {\n _text = `${this.player.playbackRate}x`\n } else {\n _text = this.getTextByLang(curItem, 'iconText')\n }\n this.find('.icon-text').innerHTML = _text\n }\n\n destroy () {\n super.destroy()\n }\n}\n","import Plugin, { Events } from '../../plugin'\nimport './index.scss'\n\nexport default class ErrorPlugin extends Plugin {\n static get pluginName () {\n return 'error'\n }\n\n afterCreate () {\n this.clickHandler = this.hook('errorRetry', this.errorRetry, {\n pre: (e) => {\n e.preventDefault()\n e.stopPropagation()\n }\n })\n\n this.onError = this.hook('showError', this.handleError)\n\n this.bind('.xgplayer-error-refresh', 'click', this.clickHandler)\n\n this.on(Events.ERROR, (error) => {\n this.onError(error)\n })\n }\n\n errorRetry (e) {\n this.emitUserAction(e, 'error_retry', {})\n this.player.retry()\n }\n\n handleError (error = {}) {\n const { player } = this\n const type = error.errorType\n let errorNote = player.errorNote ? this.i18n[player.errorNote] : ''\n if (!errorNote) {\n switch (type) {\n case 'decoder':\n errorNote = this.i18n.MEDIA_ERR_DECODE\n break\n case 'network':\n errorNote = this.i18n.MEDIA_ERR_NETWORK\n break\n default:\n errorNote = this.i18n.MEDIA_ERR_SRC_NOT_SUPPORTED\n }\n }\n this.find('.xgplayer-error-text').innerHTML = errorNote\n this.find('.xgplayer-error-tips').innerHTML = `${this.i18n.REFRESH_TIPS}<span class=\"xgplayer-error-refresh\">${this.i18n.REFRESH}</span>`\n }\n\n destroy () {\n this.unbind('.xgplayer-error-refresh', 'click', this.clickHandler)\n }\n\n render () {\n return `<xg-error class=\"xgplayer-error\">\n <div class=\"xgplayer-errornote\">\n <span class=\"xgplayer-error-text\"></span>\n <span class=\"xgplayer-error-tips\"><em class=\"xgplayer-error-refresh\"></em></span>\n </div>\n </xg-error>`\n }\n}\n","import Plugin, { STATE_CLASS, Util } from '../../plugin'\nimport './index.scss'\n\n/**\n * 消息组件\n */\nclass Prompt extends Plugin {\n static get pluginName () {\n return 'prompt'\n }\n\n static get defaultConfig () {\n return {\n interval: 3000,\n style: {},\n mode: 'arrow',\n autoHide: true,\n detail: {\n text: '',\n highlight: ''\n },\n onClick: () => {\n }\n }\n }\n\n afterCreate () {\n /**\n * @type {number}\n */\n this.intervalId = 0\n this.customConfig = null\n this.bind('.highlight', ['click', 'touchend'], (e) => {\n if (this.config.onClick || this.customOnClick) {\n e.preventDefault()\n e.stopPropagation()\n this.customOnClick ? this.customOnClick(e) : this.config.onClick(e)\n }\n })\n\n this.player.showPrompt = (...args) => {\n this.showPrompt(...args)\n }\n\n this.player.hidePrompt = () => {\n this.hide()\n }\n }\n\n setStyle (style) {\n Object.keys(style).map(key => {\n this.root.style[key] = style[key]\n })\n }\n\n showPrompt (detail, config = {}, onClick = () => {}) {\n if (!detail) {\n return\n }\n this.customOnClick = onClick\n const { interval } = this.config\n if (this.intervalId) {\n clearTimeout(this.intervalId)\n this.intervalId = null\n }\n Util.addClass(this.root, 'show')\n config.mode === 'arrow' && Util.addClass(this.root, 'arrow')\n if (typeof detail === 'string') {\n this.find('.xgplayer-prompt-detail').innerHTML = detail\n } else {\n this.find('.xgplayer-prompt-detail').innerHTML = `${detail.text || ''}` + `${detail.highlight ? `<i class=\"highlight\">${detail.highlight}</i>` : ''}`\n }\n\n config.style && this.setStyle(config.style)\n\n const autoHide = typeof config.autoHide === 'boolean' ? config.autoHide : this.config.autoHide\n if (autoHide) {\n const hideinterval = config.interval || interval\n this.intervalId = setTimeout(() => {\n this.hide()\n }, hideinterval)\n }\n }\n\n hide () {\n Util.removeClass(this.root, 'show')\n Util.removeClass(this.root, 'arrow')\n this.root.removeAttribute('style')\n this.customOnClick = null\n }\n\n render () {\n return `<xg-prompt class=\"xgplayer-prompt ${STATE_CLASS.CONTROLS_FOLLOW}\">\n <span class=\"xgplayer-prompt-detail\"></span>\n </xg-prompt>`\n }\n}\n\nexport default Prompt\n","import { Util, Events } from '../../plugin'\n\nconst ISPOT = {\n time: 0, // 进度条在此时间戳打点 单位为s\n text: '', // 打点处的自定义文案\n id: 1, // 标记唯一标识,用于删除的时候索引\n duration: 1, // 进度条标识点的时长 默认1s【可选】单位为s\n color: '#fff', // 进度条标识点的显示颜色【可选】\n style: {}, // 指定样式\n width: 6,\n height: 6\n}\n\nfunction mergeISPOT (iSpot) {\n Object.keys(ISPOT).map(key => {\n if (iSpot[key] === undefined) {\n iSpot[key] = ISPOT[key]\n }\n })\n}\n\nconst APIS = {\n _updateDotDom (iSpot, dotDom) {\n if (!dotDom) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n dotDom.setAttribute('data-text', iSpot.text)\n dotDom.setAttribute('data-time', iSpot.time)\n if (ret.isMini) {\n Util.addClass(dotDom, 'mini')\n } else {\n Util.removeClass(dotDom, 'mini')\n }\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n },\n initDots () {\n this._ispots.map(item => {\n this.createDot(item, false)\n })\n this.ispotsInit = true\n },\n\n /**\n * 创建一个故事点\n * @param { object } iSpot\n * @param { boolean } isNew\n */\n createDot (iSpot, isNew = true) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (isNew) {\n mergeISPOT(iSpot)\n this._ispots.push(iSpot)\n }\n if (!this.ispotsInit && isNew) {\n return\n }\n const ret = this.calcuPosition(iSpot.time, iSpot.duration)\n const style = iSpot.style || {}\n style.left = `${ret.left}%`\n style.width = `${ret.width}%`\n let className = `xgspot_${iSpot.id} xgplayer-spot`\n ret.isMini && (className += ' mini')\n const _t = iSpot.template ? `<div class=\"xgplayer-spot-pop\">${iSpot.template}</div>` : ''\n const dotDom = Util.createDom('xg-spot', _t, {\n 'data-text': iSpot.text,\n 'data-time': iSpot.time,\n 'data-id': iSpot.id\n }, className)\n Object.keys(style).map(key => {\n dotDom.style[key] = style[key]\n })\n progress.outer && progress.outer.appendChild(dotDom)\n this.positionDot(dotDom, iSpot.id)\n },\n\n /**\n * 根据id查找节点\n * @param {string} id\n */\n findDot (id) {\n if (!this.player.plugins.progress) {\n return\n }\n const ret = this._ispots.filter((cur, index) => {\n return cur.id === id\n })\n return ret.length > 0 ? ret[0] : null\n },\n\n /**\n * 更新故事点\n * @param {any} iSpot\n * @param {boolean} needShow\n */\n updateDot (iSpot, needShow = false) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const dot = this.findDot(iSpot.id)\n if (dot) {\n Object.keys(iSpot).map(key => {\n dot[key] = iSpot[key]\n })\n }\n if (!this.ispotsInit) {\n return\n }\n const dotDom = progress.find(`xg-spot[data-id=\"${iSpot.id}\"]`)\n if (!dotDom) {\n return\n }\n this._updateDotDom(iSpot, dotDom)\n if (needShow) {\n this.showDot(iSpot.id)\n }\n },\n\n /**\n * 删除某个故事点\n * @param {string | number } id\n */\n deleteDot (id) {\n const { _ispots } = this\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const del = []\n for (let i = 0; i < _ispots.length; i++) {\n if (_ispots[i].id === id) {\n del.push(i)\n }\n }\n const len = del.length\n for (let i = len - 1; i >= 0; i--) {\n _ispots.splice(del[i], 1)\n if (this.ispotsInit) {\n const dotDom = progress.find(`xg-spot[data-id=\"${id}\"]`)\n if (dotDom) {\n dotDom.parentElement.removeChild(dotDom)\n }\n }\n }\n },\n\n /**\n * 移除所有的故事点\n */\n deleteAllDots () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = []\n return\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n for (let i = dotDoms.length - 1; i >= 0; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n this._ispots = []\n },\n /**\n * 批量全部更新当前故事点\n * @param {Array} iSpots\n */\n updateAllDots (iSpots = []) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n if (!this.ispotsInit) {\n this._ispots = iSpots\n return\n }\n this._ispots = []\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n const len = dotDoms.length\n if (len > iSpots.length) {\n for (let i = len - 1; i > iSpots.length - 1; i--) {\n progress.outer.removeChild(dotDoms[i])\n }\n }\n iSpots.forEach((ispot, index) => {\n if (index < len) {\n dotDoms[index].setAttribute('data-id', `${ispot.id}`)\n this._ispots.push(ispot)\n this.updateDot(ispot)\n } else {\n this.createDot(ispot)\n }\n })\n },\n\n positionDots () {\n const { _ispots, playerSize } = this\n const { sizeInfo } = this.player\n const { progress } = this.player.plugins\n if (!progress || sizeInfo.width === playerSize.width) {\n return\n }\n playerSize.width = sizeInfo.width\n playerSize.left = sizeInfo.left\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n dotDom && this.positionDot(dotDom, item.id)\n })\n },\n\n positionDot (dotDom, id) {\n const _pop = Util.findDom(dotDom, '.xgplayer-spot-pop')\n if (!_pop) {\n return\n }\n const pRect = this.playerSize\n\n const rect1 = dotDom.getBoundingClientRect()\n const rect = _pop.getBoundingClientRect()\n const _left = rect1.left - pRect.left\n const _diff = pRect.width - _left - rect1.width / 2\n if (_left < rect.width / 2 || pRect.width < rect.width) {\n const t = rect.width / 2 - _left\n _pop.style.left = `${t}px`\n } else if (_diff < rect.width / 2) {\n const t = _diff - rect.width / 2 + rect1.width / 2\n _pop.style.left = `${t}px`\n } else {\n _pop.style.left = '50%'\n }\n },\n\n updateDuration () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n const { _ispots } = this\n _ispots.forEach(item => {\n const dotDom = progress.find(`xg-spot[data-id=\"${item.id}\"]`)\n this._updateDotDom(item, dotDom)\n })\n },\n\n getAllDotsDom () {\n const { progress } = this.player.plugins\n if (!progress) {\n return []\n }\n const dotDoms = progress.root.getElementsByTagName('xg-spot')\n return dotDoms\n },\n\n getDotDom (id) {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n return progress.find(`xg-spot[data-id=\"${id}\"]`)\n }\n}\n\nexport default function initDotsAPI (plugin) {\n const { config, player } = plugin\n Object.keys(APIS).map(item => {\n plugin[item] = APIS[item].bind(plugin)\n })\n const ispots = player.config.progressDot || config.ispots || []\n plugin._ispots = ispots.map(item => {\n mergeISPOT(item)\n return item\n })\n plugin.ispotsInit = false\n plugin.playerSize = {\n left: player.sizeInfo.left,\n width: player.sizeInfo.width\n }\n plugin.on(Events.DURATION_CHANGE, () => {\n if (!plugin.ispotsInit) {\n plugin.initDots()\n } else {\n // 更新节点\n plugin.updateDuration()\n }\n })\n plugin.on(Events.VIDEO_RESIZE, () => {\n plugin.positionDots()\n })\n}\n","import Plugin, { Util, Sniffer, Events } from '../../plugin'\nimport initDotsAPI from './dotsApi'\nimport './index.scss'\n/**\n * @typedef {{\n * miniWidth?: number, // 故事点显示最小宽度\n * ispots?: Array<{ //故事点列表\n * time?: number, // 进度条在此时间戳打点 单位为s\n * text?: string, // 打点处的自定义文案\n * id?: number | string, // 标记唯一标识,用于删除的时候索引\n * duration:? number, // 进度条标识点的时长 默认1s【可选】单位为s\n * color?: string, // 进度条标识点的显示颜色【可选】\n * style?: { [propName: string]: any }, // 指定样式\n * width?: number,\n * height?: number\n * }>,\n * defaultText?: '', // 故事点hover默认文案\n * isFocusDots?: true, //\n * isShowThumbnail?: true, // 是否显示预览图\n * isShowCoverPreview?: false, // 进度条拖动时是否显示播放区域预览图\n * mode?: 'short' | 'production', // short // production\n * [propName: string]: any\n * }} IProgressPreviewConfig\n */\n\nconst CALLBACK_MAP = {\n dragmove: 'onProgressMove',\n dragstart: 'onProgressDragStart',\n dragend: 'onProgressDragEnd',\n click: 'onProgressClick',\n mouseover: 'onProgressMouseOver',\n mouseenter: 'onProgressMouseOver'\n}\n\n/** */\nexport default class ProgressPreview extends Plugin {\n constructor (args) {\n super(args)\n this._ispots = []\n this.videoPreview = null\n this.videothumbnail = null\n this.thumbnail = null\n this.timeStr = ''\n this._state = {\n now: 0,\n f: false\n }\n }\n\n static get pluginName () {\n return 'progresspreview'\n }\n\n /**\n * @type IProgressPreviewConfig\n */\n static get defaultConfig () {\n return {\n index: 1,\n miniWidth: 6, // 故事点显示最小宽度\n ispots: [], // 故事点列表\n defaultText: '', // 故事点hover默认文案\n isFocusDots: true, //\n isHideThumbnailHover: true, // 是否在hover在预览图的时候隐藏\n isShowThumbnail: true, // 是否显示预览图\n isShowCoverPreview: false, // 进度条拖动时是否显示播放区域预览图\n mode: '', // short // production\n disable: false,\n width: 160, // 显示宽度\n height: 90 // 显示高度\n }\n }\n\n beforeCreate (args) {\n const progress = args.player.plugins.progress\n if (progress) {\n args.root = progress.root\n }\n }\n\n afterCreate () {\n this._curDot = null\n this.handlerSpotClick = this.hook('spotClick', (_event, data) => {\n if (data.seekTime) {\n this.player.seek(data.seekTime)\n }\n })\n this.transformTimeHook = this.hook('transformTime', (time) => {\n this.setTimeContent(Util.format(time))\n })\n initDotsAPI(this)\n\n this.on(Events.DURATION_CHANGE, () => {\n this.show()\n })\n if (this.config.disable) {\n this.disable()\n }\n // 用于进度条预览的扩展\n this.extTextRoot = this.find('.xg-spot-ext-text')\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n Object.keys(config).map(key => {\n this.config[key] = config[key]\n })\n }\n\n onPluginsReady () {\n const { player } = this\n if (!player.plugins.progress) {\n return\n }\n this.previewLine = this.find('.xg-spot-line')\n this.timePoint = this.find('.xgplayer-progress-point')\n this.timeText = this.find('.xg-spot-time')\n this.tipText = this.find('.spot-inner-text')\n\n this._hasThumnail = false\n\n this.registerThumbnail()\n\n this.bindEvents()\n }\n\n bindEvents () {\n const { progress } = this.player.plugins\n if (!progress) {\n return\n }\n Object.keys(CALLBACK_MAP).map(key => {\n this[CALLBACK_MAP[key]] = this[CALLBACK_MAP[key]].bind(this)\n progress.addCallBack(key, this[CALLBACK_MAP[key]])\n })\n\n if (Sniffer.device === 'mobile') return\n\n this.bind('.xg-spot-info', 'mousemove', this.onMousemove)\n\n this.bind('.xg-spot-info', 'mousedown', this.onMousedown)\n\n this.bind('.xg-spot-info', 'mouseup', this.onMouseup)\n\n const fun = this.hook('previewClick', (...args) => {\n // console.log('args', args)\n })\n\n this.handlerPreviewClick = (e) => {\n e.stopPropagation()\n fun(parseInt(this._state.now * 1000, 10) / 1000, e)\n\n if (progress) {\n // Make sure the mouse event is unlocked, otherwise the progress bar will still slide\n progress.onMouseUp(e)\n }\n }\n\n this.bind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n onMousemove = (e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xg-spot-content') && this.config.isHideThumbnailHover) {\n this.player.plugins.progress.onMouseLeave(e)\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMousedown = (e) => {\n if (this.config.disable) {\n return\n }\n if (this._state.f || Util.hasClass(e.target, 'xg-spot-content')) {\n Util.event(e)\n e.stopPropagation()\n }\n }\n\n onMouseup = (e) => {\n if (!this.isDrag) {\n return\n }\n const { progress } = this.player.plugins\n if (progress && progress.pos) {\n progress.onMouseUp(e)\n !progress.pos.isEnter && progress.onMouseLeave(e)\n }\n }\n\n onDotMouseLeave = (e) => {\n if (this.config.disable) {\n return\n }\n this._curDot.removeEventListener('mouseleave', this.onDotMouseLeave)\n this.blurDot(e.target)\n this._curDot = null\n const { progress } = this.player.plugins\n progress && progress.enableBlur()\n this.show()\n }\n\n onProgressMouseOver = (data, e) => {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot') && !this._curDot) {\n this._curDot = e.target\n this.focusDot(e.target)\n if (this._curDot.children.length > 0) {\n this.hide()\n }\n const { progress } = this.player.plugins\n progress && progress.disableBlur()\n this._curDot.addEventListener('mouseleave', this.onDotMouseLeave)\n }\n }\n\n onProgressMove (data, e) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.updatePosition(data.offset, data.width, data.currentTime, data.e)\n }\n\n onProgressDragStart (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = true\n this.videoPreview && Util.addClass(this.videoPreview, 'show')\n }\n\n onProgressDragEnd (data) {\n if (this.config.disable || !this.player.duration) {\n return\n }\n this.isDrag = false\n this.videoPreview && Util.removeClass(this.videoPreview, 'show')\n }\n\n onProgressClick (data, e) {\n if (this.config.disable) {\n return\n }\n if (Util.hasClass(e.target, 'xgplayer-spot')) {\n e.stopPropagation()\n e.preventDefault();\n ['time', 'id', 'text'].map(key => {\n data[key] = e.target.getAttribute(`data-${key}`)\n })\n data.time && (data.time = Number(data.time))\n this.handlerSpotClick(e, data)\n }\n }\n\n updateLinePos (offset, cwidth) {\n const { root, previewLine, player, config } = this\n const { mode } = player.controls\n const isflex = mode === 'flex'\n let lwidth = root.getBoundingClientRect().width\n // 如果当前预览图宽度获取不到,无法计算位移,不做渲染\n if (!lwidth && this._hasThumnail) {\n return\n }\n lwidth = this._hasThumnail && lwidth < config.width ? config.width : lwidth\n let x = offset - lwidth / 2\n let _t\n if (x < 0 && !isflex) {\n x = 0\n _t = offset - lwidth / 2\n } else if (x > cwidth - lwidth && !isflex) {\n _t = x - (cwidth - lwidth)\n x = cwidth - lwidth\n } else {\n _t = 0\n }\n _t !== undefined && (previewLine.style.transform = `translateX(${_t.toFixed(2)}px)`)\n root.style.transform = `translateX(${x.toFixed(2)}px) translateZ(0)`\n }\n\n updateTimeText (timeStr) {\n const { timeText, timePoint } = this\n timeText.innerHTML = timeStr\n !this.thumbnail && (timePoint.innerHTML = timeStr)\n }\n\n updatePosition (offset, cwidth, time, e) {\n const { root, config, _state } = this\n if (!root) {\n return\n }\n\n // let now = offset / cwidth * player.duration\n // now = now < 0 ? 0 : (now > player.duration ? player.duration : now)\n _state.now = time\n this.transformTimeHook(time)\n const timeStr = this.timeStr\n if (e && e.target && Util.hasClass(e.target, 'xgplayer-spot')) {\n this.showTips(e.target.getAttribute('data-text'), false, timeStr)\n this.focusDot(e.target)\n _state.f = true\n config.isFocusDots && _state.f && (_state.now = parseInt(e.target.getAttribute('data-time'), 10))\n } else if (config.defaultText) {\n _state.f = false\n this.showTips(config.defaultText, true, timeStr)\n } else {\n _state.f = false\n this.hideTips('')\n // this.blurDot()\n }\n this.updateTimeText(timeStr)\n this.updateThumbnails(_state.now)\n this.updateLinePos(offset, cwidth)\n }\n\n /**\n * @description 设置自定义时间显示字符串\n * @param {string} str\n */\n setTimeContent (str) {\n this.timeStr = str\n }\n\n updateThumbnails (time) {\n const { player, videoPreview, config } = this\n const { thumbnail } = player.plugins\n if (thumbnail && thumbnail.usable) {\n this.thumbnail && thumbnail.update(this.thumbnail, time, config.width, config.height)\n const rect = videoPreview && videoPreview.getBoundingClientRect()\n this.videothumbnail && thumbnail.update(this.videothumbnail, time, rect.width, rect.height)\n }\n }\n\n registerThumbnail (thumbnailConfig = {}) {\n if (Sniffer.device === 'mobile') {\n return\n }\n const { player, config } = this\n const thumbnail = player.getPlugin('thumbnail')\n if (thumbnail) {\n thumbnail.setConfig(thumbnailConfig)\n }\n if (!thumbnail || !thumbnail.usable || !config.isShowThumbnail) {\n Util.addClass(this.root, 'short-line no-thumbnail')\n return\n } else {\n Util.removeClass(this.root, 'short-line no-thumbnail')\n }\n if (config.mode === 'short') {\n Util.addClass(this.root, 'short-line')\n }\n this._hasThumnail = true\n const tRoot = this.find('.xg-spot-thumbnail')\n this.thumbnail = thumbnail.createThumbnail(tRoot, 'progress-thumbnail')\n if (config.isShowCoverPreview) {\n this.videoPreview = Util.createDom('xg-video-preview', '', {}, 'xgvideo-preview')\n player.root.appendChild(this.videoPreview)\n this.videothumbnail = thumbnail.createThumbnail(this.videoPreview, 'xgvideo-thumbnail')\n }\n this.updateThumbnails(0)\n }\n\n calcuPosition (time, duration) {\n const { progress } = this.player.plugins\n const { player } = this\n const totalWidth = progress.root.getBoundingClientRect().width\n const widthPerSeconds = player.duration / totalWidth * 6\n const ret = {}\n if (time + duration > player.duration) {\n duration = player.duration - time\n }\n ret.left = time / player.duration * 100\n ret.width = duration / player.duration\n ret.isMini = widthPerSeconds > duration\n return {\n left: time / player.duration * 100,\n width: duration / player.duration * 100,\n isMini: duration < widthPerSeconds\n }\n }\n\n showDot (id) {\n const dot = this.findDot(id)\n if (dot) {\n const rect = this.root.getBoundingClientRect()\n const { width } = rect\n const offset = dot.time / this.player.duration * width\n this.updatePosition(offset, width, dot.time)\n }\n }\n\n focusDot (target, id) {\n if (!target) {\n return\n }\n if (!id) {\n id = target.getAttribute('data-id')\n }\n Util.addClass(target, 'active')\n this._activeDotId = id\n }\n\n blurDot (target) {\n if (!target) {\n const id = this._activeDotId\n target = this.getDotDom(id)\n }\n if (!target) {\n return\n }\n Util.removeClass(target, 'active')\n this._activeDotId = null\n }\n\n showTips (text, isDefault, timeStr = '') {\n Util.addClass(this.root, 'no-timepoint')\n if (!text) {\n return\n }\n Util.addClass(this.find('.xg-spot-content'), 'show-text')\n if (isDefault && this.config.mode === 'production') {\n Util.addClass(this.root, 'product')\n this.tipText.textContent = text\n } else {\n Util.removeClass(this.root, 'product')\n this.tipText.textContent = this._hasThumnail ? text : `${timeStr} ${text}`\n }\n }\n\n hideTips () {\n Util.removeClass(this.root, 'no-timepoint')\n this.tipText.textContent = ''\n Util.removeClass(this.find('.xg-spot-content'), 'show-text')\n Util.removeClass(this.root, 'product')\n }\n\n hide () {\n Util.addClass(this.root, 'hide')\n }\n\n /**\n * @param {string} [value]\n * @returns\n */\n show (value) {\n Util.removeClass(this.root, 'hide')\n }\n\n enable () {\n const { config, playerConfig } = this\n this.config.disable = false\n this.show()\n if (!this.thumbnail && config.isShowThumbnail) {\n this.registerThumbnail(playerConfig.thumbnail || {})\n }\n }\n\n disable () {\n this.config.disable = true\n this.hide()\n }\n\n destroy () {\n const { progress } = this.player.plugins\n progress && Object.keys(CALLBACK_MAP).map(key => {\n progress.removeCallBack(key, this[CALLBACK_MAP[key]])\n })\n this.videothumbnail = null\n this.thumbnail = null\n this.videoPreview && this.player.root.removeChild(this.videoPreview)\n this.unbind('.xg-spot-info', 'mousemove', this.onMousemove)\n this.unbind('.xg-spot-info', 'mousedown', this.onMousedown)\n this.unbind('.xg-spot-info', 'mouseup', this.onMouseup)\n this.unbind('.xg-spot-content', 'mouseup', this.handlerPreviewClick)\n }\n\n render () {\n if (Sniffer.device === 'mobile' || this.playerConfig.isMobileSimulateMode === 'mobile') {\n return ''\n }\n\n return `<div class=\"xg-spot-info hide ${this.config.mode === 'short' ? 'short-line' : ''}\">\n <div class=\"xg-spot-content\">\n <div class=\"xg-spot-thumbnail\">\n <span class=\"xg-spot-time\"></span>\n </div>\n <div class=\"xg-spot-text\"><span class=\"spot-inner-text\"></span></div>\n </div>\n <div class=\"xgplayer-progress-point\">00:00</div>\n <div class=\"xg-spot-ext-text\"></div>\n <div class=\"xg-spot-line\"></div>\n </div>`\n }\n}\n","/* eslint-disable camelcase */\nimport BasePlugin, { Util, Events } from '../../plugin'\n/**\n * @typedef {{\n * isShow?: boolean,\n * urls?: Array<string>, // 有多张大图就多个url\n * pic_num?: number, // 每张图含有几个雪碧图\n * col?: number, // 截图列数\n * row?: number, // 截图行数\n * height?: number, // 缩略图高度\n * width?: number, // 缩略图宽度\n * scale?: number, // 缩放\n * className?: string, // 额外添加在dom上的class\n * hidePortrait?: boolean, // 是否在竖屏的时候隐藏\n * [propName: string]: any\n * }} IThumbnailConfig\n */\nexport default class Thumbnail extends BasePlugin {\n static get pluginName () {\n return 'thumbnail'\n }\n\n /**\n * @type IThumbnailConfig\n */\n static get defaultConfig () {\n return {\n isShow: false,\n urls: [], // 有多张大图就多个url就好\n pic_num: 0, // 每张图含有几个雪碧图\n col: 0, // 截图列数\n row: 0, // 截图行数\n height: 90, // 缩略图高度\n width: 160, // 缩略图宽度\n scale: 1, // 缩放\n className: '', // 额外添加在dom上的class\n hidePortrait: false // 是否在竖屏的时候隐藏\n }\n }\n\n constructor (args) {\n super(args)\n this.ratio = 1\n this.interval = null\n this._preloadMark = {}\n }\n\n afterCreate () {\n if (this.usable) {\n this.initThumbnail()\n }\n this.on([Events.DURATION_CHANGE], () => {\n const { pic_num, interval } = this.config\n this.usable && (this.interval = interval > 0 ? interval : Math.round(this.player.duration * 1000 / pic_num) / 1000)\n })\n }\n\n setConfig (config) {\n if (!config) {\n return\n }\n const keys = Object.keys(config)\n if (keys.length < 1) {\n return\n }\n keys.forEach(key => {\n this.config[key] = config[key]\n })\n this.usable && this.initThumbnail()\n }\n\n get usable () {\n const { urls, pic_num } = this.config\n return urls && urls.length > 0 && pic_num > 0\n }\n\n initThumbnail () {\n const { width, height, pic_num, interval } = this.config\n this.ratio = width / height * 100\n this.interval = interval || Math.round(this.player.duration / pic_num)\n this._preloadMark = {}\n // this.preload(0)\n // this.preIndex = new Array(urls.length)\n // this.interval = interval || Math.round(this.player.duration / pic_num)\n // this.ratio = width / height * 100\n // className && Util.addClass(this.root, className)\n // hidePortrait && Util.addClass(this.root, 'portrait')\n // width && (this.root.style.width = `${width}px`)\n // height && (this.root.style.height = `${height}px`)\n // this.root.style.backgroundSize = `${width * col}px auto`\n }\n\n getUrlByIndex (index) {\n return index >= 0 && index < this.config.urls.length ? this.config.urls[index] : ''\n }\n\n preload (index) {\n if (this._preloadMark[index]) {\n return\n }\n const { urls } = this.config\n const len = urls.length\n const arr = []\n index > 0 && arr.push(index - 1)\n arr.push(index)\n index > 0 && index < len - 1 && arr.push(index + 1)\n arr.map(item => {\n if (!this._preloadMark[item] && item >= 0 && item < len) {\n this._preloadMark[item] = 1\n Util.preloadImg(urls[item], () => {\n this._preloadMark[item] = 2\n })\n }\n })\n }\n\n getPosition (now, containerWidth = 0, containerHeight = 0) {\n const { pic_num, row, col, width, height } = this.config\n this.interval = Math.round(this.player.duration / pic_num)\n let index = Math.ceil(now / this.interval) // 当前时间对应的图像索引\n index = index > pic_num ? pic_num : index\n const urlIndex = index < row * col ? 0 : (Math.ceil(index / (row * col)) - 1)// 当前图像所在的url索引\n const indexInPage = index - urlIndex * (col * row) // 当前图像在当前url中的索引\n const rowIndex = indexInPage > 0 ? Math.ceil(indexInPage / col) - 1 : 0// 当前图像在当前url中的行索引\n const colIndex = indexInPage > 0 ? indexInPage - rowIndex * col - 1 : 0 // 当前图像在当前url中的列索引\n let swidth = 0 // containerWidth || width\n let sHeight = 0 // swidth * height / width\n\n // 根据入参的宽高适配样式\n if (containerWidth && containerHeight) {\n const per = containerWidth / containerHeight\n if (per < width / height) {\n sHeight = containerHeight\n swidth = sHeight * (width / height)\n // swidth = containerWidth\n // sHeight = swidth / (width / height)\n } else {\n swidth = containerWidth\n sHeight = swidth / (width / height)\n }\n } else if (!containerHeight) {\n swidth = containerWidth || width\n sHeight = swidth / (width / height)\n } else if (!containerWidth) {\n sHeight = containerHeight || height\n swidth = sHeight * (width / height)\n }\n const url = this.getUrlByIndex(urlIndex)\n return {\n urlIndex,\n rowIndex,\n colIndex,\n url,\n height: sHeight,\n width: swidth,\n style: {\n backgroundImage: `url(${url})`,\n backgroundSize: `${swidth * col}px auto`,\n backgroundPosition: `-${colIndex * swidth}px -${rowIndex * sHeight}px`,\n width: `${swidth}px`,\n height: `${sHeight}px`\n }\n }\n }\n\n update (dom, now, containerWidth = 0, containerHeight = 0, customStyle = '') {\n const { pic_num, urls } = this.config\n if (pic_num <= 0 || !urls || urls.length === 0) {\n return\n }\n const pos = this.getPosition(now, containerWidth, containerHeight)\n this.preload(pos.urlIndex)\n\n Object.keys(pos.style).map((key) => {\n dom.style[key] = pos.style[key]\n })\n Object.keys(customStyle).map(key => {\n dom.style[key] = customStyle[key]\n })\n }\n\n // 对外暴露 切换缩略图配置\n changeConfig (newConfig = {}) {\n this.setConfig(newConfig)\n }\n\n createThumbnail (root, className) {\n const dom = Util.createDom('xg-thumbnail', '', {}, `thumbnail ${className}`)\n root && root.appendChild(dom)\n return dom\n }\n}\n","import Plugin, { Events, Util } from '../../plugin'\n\nfunction getBgColor (color) {\n return color ? `background:${color};` : ''\n}\n\nclass MiniProgress extends Plugin {\n static get pluginName () {\n return 'MiniProgress'\n }\n\n static get defaultConfig () {\n return {\n mode: 'auto',\n height: 2\n }\n }\n\n get offsetDuration () {\n return this.playerConfig.customDuration || this.player.offsetDuration || this.player.duration\n }\n\n get currentTime () {\n const { offsetCurrentTime, currentTime } = this.player\n return offsetCurrentTime >= 0 ? offsetCurrentTime : currentTime\n }\n\n afterCreate () {\n if (!this.root) {\n return\n }\n this.on(Events.TIME_UPDATE, this.onTimeupdate)\n this.on(Events.EMPTIED, () => {\n this.reset()\n })\n }\n\n onTimeupdate = () => {\n const { ended } = this.player\n const { offsetDuration } = this\n let time = this.currentTime\n time = Util.adjustTimeByDuration(time, offsetDuration, ended)\n this.update({ played: time }, offsetDuration)\n }\n\n reset () {\n this.update({ played: 0, cached: 0 }, 0)\n }\n\n update (data = { cached: 0, played: 0 }, duration) {\n if (!duration || !this.root) {\n return\n }\n if (data.cached) {\n this.find('xg-mini-progress-cache').style.width = `${data.cached / duration * 100}%`\n }\n if (data.played) {\n this.find('xg-mini-progress-played').style.width = `${data.played / duration * 100}%`\n }\n }\n\n render () {\n const { commonStyle, miniprogress } = this.playerConfig\n if (!miniprogress) {\n return\n }\n const { mode, height } = this.config\n const _style = {\n cached: getBgColor(commonStyle.cachedColor),\n played: getBgColor(commonStyle.playedColor),\n progress: getBgColor(commonStyle.progressColor),\n height: height > 0 && height !== 2 ? `height: ${height}px;` : ''\n }\n const stateClass = mode === 'show' ? 'xg-mini-progress-show' : ''\n return `<xg-mini-progress class=\"xg-mini-progress ${stateClass}\" style=\"${_style.progress} ${_style.height}\">\n <xg-mini-progress-cache class=\"xg-mini-progress-cache\" style=\"${_style.cached}\"></xg-mini-progress-cache>\n <xg-mini-progress-played class=\"xg-mini-progress-played\" style=\"${_style.played}\"></xg-mini-progress-played>\n </xg-mini-progress>`\n }\n}\n\nexport default MiniProgress\n","import Plugin, { Events, Util, Sniffer } from '../../plugin'\nimport XG_DEBUG from '../../utils/debug'\nimport './index.scss'\n\nconst MODES = {\n REAL_TIME: 'realtime',\n FIRST_FRAME: 'firstframe',\n FRAME_RATE: 'framerate',\n POSTER: 'poster'\n}\n\nfunction nowTime () {\n try {\n return parseInt(window.performance.now(), 10)\n } catch (e) {\n return new Date().getTime()\n }\n}\n\n/**\n * Check whether the current environment supports canvas\n * @returns { boolean }\n */\nfunction checkIsSupportCanvas () {\n try {\n const ctx = document.createElement('canvas').getContext\n if (ctx) {\n return true\n }\n return false\n } catch (e) {\n return false\n }\n}\n\n/**\n * @typedef { {\n * disable?: boolean,\n * mode?: \"realtime\" | \"firstframe\" | \"framerate\",\n * frameRate?: number\n * filter?: string,\n * addMask?: boolean,\n * maskBg?: string,\n * multiple? : number,\n * [propName: string]: any\n * } } IDynamicBgConfig\n */\n\nlet isSupportCanvas = null\nclass DynamicBg extends Plugin {\n static get pluginName () {\n return 'dynamicBg'\n }\n\n /**\n * @type IDynamicBgConfig\n */\n static get defaultConfig () {\n return {\n isInnerRender: false,\n disable: true,\n index: -1,\n /**\n * Rendering method\n * realtime - Realtime rendering\n * firstframe - Render only the first frame\n * framerate - Render by frame\n * poster - Render by poster only\n */\n mode: 'framerate',\n frameRate: 10, // Frame rate when mode=framerate\n filter: 'blur(50px)', // Filter settings\n startFrameCount: 2, // 起始连续渲染次数\n startInterval: 0, // 初始渲染间隔\n addMask: true, // Whether need a mask\n multiple: 1.2, // 画面放大倍数\n maskBg: 'rgba(0,0,0,0.7)' // Mask background color\n }\n }\n\n /**\n * @type {boolean}\n * @description Does the current environment support Canvas\n */\n static get isSupport () {\n if (typeof isSupportCanvas === 'boolean') {\n return isSupportCanvas\n }\n isSupportCanvas = checkIsSupportCanvas()\n return isSupportCanvas\n }\n\n static supportCanvasFilter () {\n return !(Sniffer.browser === 'safari' || Sniffer.browser === 'firefox')\n }\n\n afterCreate () {\n if (this.playerConfig.dynamicBg === true) {\n this.config.disable = false\n }\n if (!DynamicBg.isSupport) {\n this.config.disable = true\n }\n const { disable, mode, frameRate } = this.config\n if (disable) {\n return\n }\n /**\n * @private\n */\n this._pos = {\n width: 0,\n height: 0,\n rwidth: 0,\n rheight: 0,\n x: 0,\n y: 0,\n pi: 0\n }\n /**\n * @readonly\n */\n this.isStart = false\n\n this._isLoaded = false\n /**\n * @readonly\n */\n this.videoPI = 0\n /**\n * @readonly\n */\n this.preTime = 0\n /**\n * @readonly\n */\n this.interval = parseInt(1000 / frameRate, 10)\n\n /**\n * @readonly\n */\n this.canvas = null\n /**\n * @readonly\n */\n this.canvasCtx = null\n\n this._frameCount = 0\n\n this._loopType = this.config.mode !== MODES.REAL_TIME && this.interval >= 1000 ? 'timer' : 'animation'\n\n this.once(Events.COMPLETE, () => {\n if (!this.player) {\n return\n }\n this.init()\n this.renderByPoster()\n if (!this.player.paused) {\n this.start()\n }\n })\n\n if (mode === MODES.POSTER) {\n return\n }\n\n if (mode !== MODES.FIRST_FRAME) {\n this.on(Events.EMPTIED, () => {\n this.stop()\n })\n this.on(Events.PLAY, () => {\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n })\n this.on(Events.PAUSE, () => {\n this.stop()\n })\n }\n\n this.on(Events.LOADED_DATA, this.onLoadedData)\n this.on(Events.LOAD_START, () => {\n this._isLoaded = false\n this.stop()\n })\n document.addEventListener('visibilitychange', this.onVisibilitychange)\n }\n\n setConfig (config) {\n Object.keys(config).forEach(key => {\n if (key === 'root' && config[key] !== this.config[key]) {\n this.reRender(config[key])\n } else if (key === 'frameRate') {\n this.interval = parseInt(1000 / config[key], 10)\n } else if (key === 'disable' && config[key]) {\n this.stop()\n }\n this.config[key] = config[key]\n })\n }\n\n onLoadedData = (e) => {\n if (!this.player) { return }\n this._frameCount = this.config.startFrameCount\n this.stop()\n this.renderOnTimeupdate(e)\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n this.on(Events.TIME_UPDATE, this.renderOnTimeupdate)\n }\n\n onVisibilitychange = (e) => {\n if (document.visibilityState === 'visible') {\n this._checkIfCanStart() && this.start()\n } else if (document.visibilityState === 'hidden') {\n this.stop()\n }\n }\n\n /**\n * @private\n * 初始化 canvas对象并使用海报图先渲染首帧w11\n */\n init (_root) {\n const { player, config } = this\n this.canvasFilter = DynamicBg.supportCanvasFilter()\n try {\n // 保证节点插入到video之前\n let parent = _root || config.root\n if (!parent) {\n parent = !config.isInnerRender ? player.root : (player.innerContainer || player.root)\n }\n parent.insertAdjacentHTML('afterbegin',\n `<div class=\"xgplayer-dynamic-bg\" data-index=\"${config.index}\"><canvas>\n </canvas><xgmask></xgmask></div>`)\n this.root = parent.children[0]\n this.canvas = this.find('canvas')\n // safari中canvas filter不生效, 使用css滤镜\n if (!this.canvasFilter) {\n this.canvas.style.filter = config.filter\n this.canvas.style.webkitFilter = config.filter\n }\n this.mask = this.find('xgmask')\n\n config.addMask && (this.mask.style.background = config.maskBg)\n this.canvasCtx = this.canvas.getContext('2d')\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n reRender (root) {\n const { disable } = this.config\n if (!disable && !this.root) {\n return\n }\n this.stop()\n const _p = this.root ? this.root.parentElement : null\n if (_p !== root) {\n _p.removeChild(this.root)\n }\n if (!root) {\n this.root = null\n return\n }\n this.init(root)\n this.renderOnce()\n const { startInterval } = this.config\n this._checkIfCanStart() && this.start(0, startInterval)\n }\n\n /**\n * Check whether the current video object supports screenshots\n * @param { Object } video\n * @returns { DomElement | null }\n */\n checkVideoIsSupport (video) {\n if (!video) {\n return null\n }\n const _tVideo = video && video instanceof window.HTMLVideoElement ? video : (video.canvas ? video.canvas : (video.flyVideo ? video.flyVideo : null))\n if (_tVideo && !(Sniffer.browser === 'safari' && Util.isMSE(_tVideo))) {\n return _tVideo\n }\n\n const _tagName = _tVideo ? _tVideo.tagName.toLowerCase() : ''\n if (_tagName === 'canvas' || _tagName === 'img') {\n return _tVideo\n }\n\n return null\n }\n\n renderByPoster () {\n const { poster } = this.playerConfig\n if (poster) {\n const url = Util.typeOf(poster) === 'String' ? poster : (Util.typeOf(poster.poster) === 'String' ? poster.poster : null)\n this.updateImg(url)\n }\n }\n\n renderOnTimeupdate = (e) => {\n if (this._frameCount > 0) {\n this.renderOnce()\n this._frameCount--\n } else {\n this._isLoaded = true\n this.off(Events.TIME_UPDATE, this.renderOnTimeupdate)\n const { startInterval } = this.config\n !this.player.paused && this._checkIfCanStart() && this.start(0, startInterval)\n }\n }\n\n _checkIfCanStart () {\n const { mode } = this.config\n return this._isLoaded && !this.player.paused && mode !== MODES.FIRST_FRAME && mode !== MODES.POSTER\n }\n\n /**\n * just render once\n * @returns\n */\n renderOnce () {\n const video = this.player.video\n if (!video.videoWidth || !video.videoHeight) {\n return\n }\n this.videoPI = parseInt(video.videoWidth / video.videoHeight * 100, 10)\n const _sVideo = this.checkVideoIsSupport(video)\n // console.log('>>>renderOnce, update', _sVideo, this.videoPI)\n _sVideo && this.update(_sVideo, this.videoPI)\n }\n\n start = (time, interval) => {\n const video = this.player.video\n const _now = nowTime()\n const _sVideo = this.checkVideoIsSupport(video)\n if (!_sVideo || !this.canvasCtx) {\n return\n }\n\n if (!interval) {\n interval = this.interval\n }\n this.stop()\n if (video.videoWidth && video.videoHeight) {\n this.videoPI = video.videoHeight > 0 ? parseInt(video.videoWidth / video.videoHeight * 100, 10) : 0\n if (this.config.mode === MODES.REAL_TIME) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n } else if (_now - this.preTime >= interval) {\n video && video.videoWidth && this.update(_sVideo, this.videoPI)\n this.preTime = _now\n }\n }\n this.frameId = this._loopType === 'timer' ? Util.setTimeout(this, this.start, interval) : Util.requestAnimationFrame(this.start)\n }\n\n stop = () => {\n if (this.frameId) {\n this._loopType === 'timer' ? Util.clearTimeout(this, this.frameId) : Util.cancelAnimationFrame(this.frameId)\n // window.clearTimeout(this.frameId)\n this.frameId = null\n }\n }\n\n updateImg (url) {\n // TODO: 需要改造,使用domcss样式渲染,不再使用canvas渲染\n if (!url) {\n return\n }\n // Render using the image\n const { width, height } = this.canvas.getBoundingClientRect()\n let image = new window.Image()\n image.onload = () => {\n if (!this.canvas || this.frameId || this.isStart) {\n return\n }\n this.canvas.height = height\n this.canvas.width = width\n const pi = parseInt(width / height * 100, 10)\n // console.log('>>>updateImg update', image, pi)\n this.update(image, pi)\n image = null\n }\n image.src = url\n }\n\n update (video, sourcePI) {\n if (!this.canvas || !this.canvasCtx || !sourcePI) {\n return\n }\n try {\n const { _pos, config } = this\n const { width, height } = this.canvas.getBoundingClientRect()\n if (width !== _pos.width || height !== _pos.height || _pos.pi !== sourcePI) {\n const pi = parseInt(width / height * 100, 10)\n _pos.pi = sourcePI\n _pos.width !== width && (_pos.width = this.canvas.width = width)\n _pos.height !== height && (_pos.height = this.canvas.height = height)\n let rheight = height\n let rwidth = width\n if (pi < sourcePI) {\n rwidth = parseInt(height * sourcePI / 100, 10)\n } else if (pi > sourcePI) {\n rheight = parseInt(width * 100 / sourcePI, 10)\n }\n _pos.rwidth = rwidth * config.multiple\n _pos.rheight = rheight * config.multiple\n _pos.x = (width - _pos.rwidth) / 2\n _pos.y = (height - _pos.rheight) / 2\n }\n // console.log(`x:${_pos.x} y:${_pos.y} rwidth:${_pos.rwidth} rheight:${_pos.rheight}`)\n this.canvasFilter && (this.canvasCtx.filter = config.filter)\n this.canvasCtx.drawImage(video, _pos.x, _pos.y, _pos.rwidth, _pos.rheight)\n } catch (e) {\n XG_DEBUG.logError('plugin:DynamicBg', e)\n }\n }\n\n destroy () {\n this.stop()\n document.removeEventListener('visibilitychange', this.onVisibilitychange)\n this.canvasCtx = null\n this.canvas = null\n }\n\n render () {\n return ''\n }\n}\n\nexport default DynamicBg\n","import { BasePlugin, Events } from '../../plugin'\nconst INFO = 'info'\n\nconst { STATS_EVENTS } = Events\nexport default class Stats extends BasePlugin {\n static get pluginName () {\n return 'stats'\n }\n\n static get defaultConfig () {\n return {\n }\n }\n\n _recordUserActions = (actionData) => {\n const time = this._getTime()\n const payload = Object.assign({}, actionData, { msg: actionData.msg || actionData.action })\n this._stats[INFO].push({\n type: 'userAction',\n ...time,\n payload\n })\n }\n\n _getTime () {\n return {\n timestamp: Date.now(),\n timeFormat: new Date().toISOString()\n }\n }\n\n afterCreate () {\n this.reset()\n this.on(Events.USER_ACTION, this._recordUserActions)\n this.on(STATS_EVENTS.STATS_INFO, this._recordInfo)\n this.on(STATS_EVENTS.STATS_DOWNLOAD, this._downloadStats)\n this.on(STATS_EVENTS.STATS_RESET, this._onReset)\n }\n\n destroy () {\n this.offAll()\n }\n\n _onReset = () => {\n this.reset()\n }\n\n _recordInfo = (data) => {\n this.info(data)\n }\n\n _downloadStats = () => {\n const stats = this.getStats()\n const blob = new Blob([JSON.stringify(stats)], { type: 'application/json' })\n const downloadUrl = window.URL.createObjectURL(blob)\n const link = document.createElement('a')\n link.style.display = 'none'\n link.href = downloadUrl\n link.download = 'player.txt'\n link.disabled = false\n link.click()\n }\n\n downloadStats () {\n this._downloadStats()\n }\n\n /**\n * @params type\n */\n info (data) {\n if (data.profile) {\n this._infoProfile(data)\n } else {\n this._info(data)\n }\n }\n\n _info (data) {\n const time = this._getTime()\n this._stats[INFO].push({\n ...time,\n payload: data\n })\n }\n\n _infoProfile (data) {\n if (data && data.startMs) {\n const endMs = Date.now()\n const dur = endMs - data.startMs\n const profile = {\n cat: 'function',\n dur: dur,\n name: data.name || data.msg,\n ph: 'X',\n pid: 0,\n tid: 0,\n ts: data.startMs,\n profile: true,\n ...data\n }\n this._info(profile)\n } else {\n console.warn('infoProfile need object data, include startMs')\n }\n }\n\n reset () {\n this._stats = {\n [INFO]: [],\n media: {}\n }\n }\n\n getStats () {\n const { player } = this\n const mediaElem = player.media\n const buffered = []\n for (let i = 0; i < mediaElem.buffered.length; i++) {\n buffered.push({\n start: mediaElem.buffered.start(i),\n end: mediaElem.buffered.end(i)\n })\n }\n const mediaInfo = {\n currentTime: mediaElem.currentTime,\n readyState: mediaElem.readyState,\n buffered,\n paused: mediaElem.paused,\n ended: mediaElem.ended\n }\n\n this._stats.media = mediaInfo\n return {\n raw: this._stats,\n timestat: this._getTimeStats(),\n profile: this._getProfile()\n }\n }\n\n _getTimeStats () {\n const allStat = this._stats[INFO]\n const msgs = allStat.map(stat => {\n const data = stat.payload.data\n let msg = ''\n try {\n if (data instanceof Error) {\n msg = data.msg\n } else if (data !== undefined) {\n msg = JSON.stringify(data)\n }\n } catch (error) {\n console.log('err', error)\n }\n\n return `[${stat.timeFormat}] : ${stat.payload.msg} ${msg} `\n })\n return msgs\n }\n\n _getProfile () {\n const profile = {\n traceEvents: []\n }\n const allStat = this._stats[INFO]\n allStat.forEach(stat => {\n if (stat.payload.profile) {\n profile.traceEvents.push(stat.payload)\n }\n })\n return profile\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class GapJump extends BasePlugin {\n static get pluginName () {\n return 'gapJump'\n }\n\n static get defaultConfig () {\n return {\n useGapJump: false,\n smallGapLimit: 0.5,\n gapDetectionThreshold: 0.3\n }\n }\n\n afterCreate () {\n const { useGapJump } = this.config\n if (useGapJump === false) {\n return\n }\n this.hasPlayed = false\n this.seekingEventReceived = false\n this.isSafari = /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform)\n this.on(Events.WAITING, this.onGapJump)\n\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n\n this.on(Events.SEEKING, () => {\n this.seekingEventReceived = true\n })\n }\n\n onGapJump = () => {\n const { player, config } = this\n if (player.media.readyState === HTMLMediaElement.HAVE_NOTHING) {\n return\n }\n if (player.media.seeking) {\n if (!this.seekingEventReceived) { return }\n } else {\n this.seekingEventReceived = false\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n\n const buffered = player.media.buffered\n const smallGapLimit = config.smallGapLimit || 0.5\n const gapDetectionThreshold = config.gapDetectionThreshold || 0.3\n const currentTime = player.media.currentTime\n const idx = this._getIndex(buffered, currentTime, gapDetectionThreshold)\n if (idx === null || idx === 0) {\n return\n }\n console.log('GapJump bufferRange ', buffered.start(idx), buffered.end(idx))\n const jumpTo = buffered.start(idx) + 0.1\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n const jumpSize = jumpTo - currentTime\n const isGapSmall = jumpSize <= smallGapLimit\n if (jumpSize < GapJump.BROWSER_GAP_TOLERANCE) {\n return\n }\n\n if (isGapSmall) {\n if (config.useGapJump !== false) {\n player.media.currentTime = this.isSafari ? jumpTo + 0.1 : jumpTo\n }\n this.player && this.player.emit('detectGap')\n console.log('gapJump gapIndex', idx, ' isGapSamll:', isGapSmall, ' currentTime:', player.media.currentTime, ' jumpSize:', (currentTime - player.media.currentTime))\n // 目前转码视频首个分片cts存在,在Safari下为0.08,先忽略\n if (jumpTo !== 0.08) {\n player && player.emit('log', {\n type: 'oneevent', // 事件类型\n end_type: 'gap',\n vid: player.config.vid,\n ext: {\n video_postion: Math.floor(jumpTo * 1000) // ms\n }\n })\n }\n }\n }\n\n _getIndex (buffered, time, threshold) {\n if (!buffered || !buffered.length) {\n return null\n }\n if (buffered.length === 1 && buffered.end(0) - buffered.start(0) < 1e-6) {\n return null\n }\n const bufferedInfo = this._getBuffered(buffered)\n let idx = null\n for (let i = 0; i < bufferedInfo.length; i++) {\n const item = bufferedInfo[i]\n if (item.start > time && (i === 0 || bufferedInfo[i - 1].end - time <= threshold)) {\n idx = i\n break\n }\n }\n return idx\n }\n\n _getBuffered (b) {\n if (!b) {\n return []\n }\n const ret = []\n for (let i = 0; i < b.length; i++) {\n ret.push({\n start: b.start(i),\n end: b.end(i)\n })\n }\n return ret\n }\n}\nGapJump.BROWSER_GAP_TOLERANCE = 0.001\n","import BasePlugin, { Events } from '../../plugin'\n\nexport default class WaitingTimeoutJump extends BasePlugin {\n static get pluginName () {\n return 'waitingTimeoutJump'\n }\n\n static get defaultConfig () {\n return {\n useWaitingTimeoutJump: false,\n waitingTime: 15, // wait超过此时间没恢复,则向前跳jumpSize,单位s\n jumpSize: 2, // 单位s,\n jumpCntMax: 4 // 一次播放最大向前跳几次\n }\n }\n\n afterCreate () {\n const { useWaitingTimeoutJump, jumpSize } = this.config\n if (useWaitingTimeoutJump === false) {\n return\n }\n this.hasPlayed = false\n this.jumpCnt = 0\n /**\n * @type {null | number}\n */\n this.timer = null\n this.jumpSize = jumpSize\n this.on(Events.WAITING, this.onWaiting)\n this.on([Events.PLAYING, Events.CANPLAY], () => {\n clearTimeout(this.timer)\n this.timer = null\n this.jumpSize = this.config.jumpSize\n })\n this.on(Events.PLAY, () => {\n this.hasPlayed = true\n })\n }\n\n onWaiting = () => {\n const { config } = this\n if (this.jumpCnt > config.jumpCntMax || this.timer || config.useWaitingTimeoutJump === false) {\n return\n }\n this.timer = setTimeout(this.onJump, config.waitingTime * 1000)\n }\n\n onJump = () => {\n const { player, config } = this\n clearTimeout(this.timer)\n this.timer = null\n if (this.jumpCnt > config.jumpCntMax || config.useWaitingTimeoutJump === false) {\n return\n }\n\n if (player.media.paused && player.media.currentTime !== 0 && this.hasPlayed) {\n return\n }\n this.jumpSize = config.jumpSize * (this.jumpCnt + 1)\n if (this.jumpCnt === config.jumpSize && this.jumpSize < 6) {\n this.jumpSize = 6\n }\n const jumpTo = player.currentTime + this.jumpSize\n const seekEnd = player.media.duration\n\n if (jumpTo > seekEnd) {\n return\n }\n this.jumpCnt++\n player.currentTime = jumpTo\n }\n}\n","import BasePlugin, { Events, Util } from '../../plugin'\nconst DEFAULT_SPEED_TYPE = 'cdn'\nconst SPEED_TYPE = ['cdn'] // 默认的速度的种类,可以通过addSpeedTypeList再继续增加\nexport default class TestSpeed extends BasePlugin {\n static get pluginName () {\n return 'testspeed'\n }\n\n static get defaultConfig () {\n return {\n openSpeed: false, // 测速开关,默认关\n testCnt: 3, // 一次播放的测速次数,默认1次\n loadSize: 200 * 1024, // 一次播放的测速请求的数据量大小,单位字节,默认200k\n testTimeStep: 3000, // 每次测速的时间间隔,第一次在开播后的testTimeStep 秒,默认是3s\n url: '', // 每次测速的url,一般传播放的备用地址测速\n saveSpeedMax: 5, // 保留最近多少次测速记录,最后的速度求这个记录列表平均值,默认5条\n addSpeedTypeList:[] // 需要增加的speed的类型\n }\n }\n\n getSpeed = (type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return 0\n if (this.speedListCache[type].length <= 0) return 0\n let total = 0\n this.speedListCache[type].map(item => {\n total += item\n })\n return Math.floor(total / this.speedListCache[type].length)\n }\n\n afterCreate () {\n const { openSpeed, addSpeedTypeList } = this.config\n if (addSpeedTypeList?.length > 0) {\n SPEED_TYPE.push(...addSpeedTypeList)\n }\n this.initSpeedList()\n this.on('real_time_speed', this._onRealSpeedChange)\n /**\n * @type {null || number }\n */\n this.timer = null\n this.cnt = 0\n this.xhr = null\n if (!openSpeed) {\n return\n }\n this.on([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n }\n startTimer = () => {\n if (Util.isMSE(this.player.video)) {\n return\n }\n this.initSpeedList()\n this.cnt = 0\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n\n initSpeedList = () => {\n this.speedListCache = {}\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache[type] = []\n })\n }\n\n _onRealSpeedChange = (data) => {\n data.speed && this.appendList(data.speed, data.type || DEFAULT_SPEED_TYPE)\n }\n\n testSpeed = () => {\n clearTimeout(this.timer)\n this.timer = null\n if (!this.player || !this.config.openSpeed) return\n const { url, loadSize, testCnt, testTimeStep } = this.config\n const testSpeedUrl = url + (url.indexOf('?') < 0 ? '?testst=' : '&testst=') + Date.now()\n if (this.cnt >= testCnt) {\n return\n }\n this.cnt++\n try {\n const start = new Date().getTime()\n let end = null\n const xhr = new XMLHttpRequest()\n this.xhr = xhr\n xhr.open('GET', testSpeedUrl)\n const headers = {}\n const random = Math.floor(Math.random() * 10)\n headers.Range = 'bytes=' + random + '-' + (loadSize + random)\n if (headers) {\n Object.keys(headers).forEach(k => {\n xhr.setRequestHeader(k, headers[k])\n })\n }\n xhr.onreadystatechange = () => {\n if (xhr.readyState === 4) {\n this.xhr = null\n end = new Date().getTime()\n const size = xhr.getResponseHeader('Content-Length') / 1024 * 8\n const speed = Math.round(size * 1000 / (end - start))\n this.appendList(speed)\n this.timer = setTimeout(this.testSpeed, testTimeStep)\n }\n }\n xhr.send()\n } catch (e) {\n console.error(e)\n }\n }\n\n appendList = (speed, type = DEFAULT_SPEED_TYPE) => {\n if (!this.speedListCache || !this.speedListCache[type]) return\n const { saveSpeedMax } = this.config\n if (this.speedListCache[type].length >= saveSpeedMax) {\n this.speedListCache[type].shift()\n }\n this.speedListCache[type].push(speed)\n const { player } = this\n if (player) {\n type === DEFAULT_SPEED_TYPE ? (player.realTimeSpeed = speed) : (player[this.getSpeedName('realTime', type)] = speed)\n }\n this.updateSpeed(type)\n }\n\n getSpeedName (namePrefix, type){\n return namePrefix + 'Speed' + type.toUpperCase()\n }\n\n updateSpeed = (type = DEFAULT_SPEED_TYPE) => {\n const speed = this.getSpeed(type)\n const { player } = this\n if (player) {\n if (type === DEFAULT_SPEED_TYPE) {\n if ((!player.avgSpeed || speed !== player.avgSpeed)) {\n player.avgSpeed = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n } else {\n const speedName = this.getSpeedName('avg', type)\n if (!player[speedName] || speed !== player[speedName]) {\n player[speedName] = speed\n player.emit(Events.DOWNLOAD_SPEED_CHANGE, {speed: speed, realTimeSpeed: player.realTimeSpeed})\n }\n }\n }\n }\n\n set openSpeed (value) {\n this.config.openSpeed = value\n if (!value && this.timer) {\n clearTimeout(this.timer)\n this.timer = null\n return\n }\n if (this.config.openSpeed) {\n if (this.timer) return\n this.timer = setTimeout(this.testSpeed, this.config.testTimeStep)\n }\n }\n\n get openSpeed () {\n return this.config.openSpeed\n }\n\n destroy () {\n this.off('real_time_speed', this._onRealSpeedChange)\n this.off([Events.LOADED_DATA, Events.REPLAY], this.startTimer)\n SPEED_TYPE.forEach((type)=> {\n this.speedListCache && this.speedListCache[type] && (this.speedListCache[type] = [])\n })\n this.speedListCache && (this.speedListCache = {})\n clearTimeout(this.timer)\n this.timer = null\n if (this.xhr && this.xhr.readyState !== 4) {\n this.xhr.cancel && this.xhr.cancel()\n this.xhr = null\n }\n }\n}\n","import BasePlugin, { Events } from '../../plugin'\n\n/**\n * @typedef { {\n * tick?: number,\n * stuckCount?: number,\n * disable?: boolean,\n * reportFrame?: number\n * } } IFullscreenConfig\n */\nexport default class FpsDetect extends BasePlugin {\n static get pluginName () {\n return 'FpsDetect'\n }\n\n static get defaultConfig () {\n return {\n disabled: false,\n tick: 1000, // tick时间,默认1000 ms\n stuckCount: 3, // 卡住次数\n reportFrame: 0 // 每次解码帧率小于多少时统计\n }\n }\n\n afterCreate () {\n const { player, config } = this\n const media = player.media || player.video\n this.timer = null\n this._lastDecodedFrames = 0\n this._currentStuckCount = 0\n this._lastCheckPoint = null\n this._payload = []\n if (config.disabled) return\n const getVideoPlaybackQuality = media.getVideoPlaybackQuality\n if (!getVideoPlaybackQuality) return\n this.on(Events.PLAY, () => {\n this._startTick()\n })\n\n this.on(Events.PAUSE, () => {\n this._stopTick()\n })\n\n this.on(Events.ENDED, () => {\n this._stopTick()\n })\n\n this.on(Events.EMPTIED, () => {\n this._stopTick()\n })\n }\n\n _startTick () {\n this._stopTick()\n this._timer = setTimeout(() => {\n this._checkDecodeFPS()\n this._startTick()\n }, this.config.tick)\n }\n\n _stopTick () {\n clearTimeout(this._timer)\n this._timer = null\n }\n\n _checkBuffer (curTime, buffered) {\n let enoughBuffer = false\n const buffers = []\n for (let i = 0; i < buffered.length; i++) {\n const start = buffered.start(i)\n const end = buffered.end(i)\n buffers.push({ start, end })\n if (start <= curTime && curTime <= end - 1) {\n enoughBuffer = true\n break\n }\n }\n return {\n enoughBuffer,\n buffers\n }\n }\n\n _checkStuck (curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval) {\n const media = this.player.media || this.player.video\n const hidden = document.hidden\n const { paused, readyState, currentTime, buffered } = media\n\n if (hidden || paused || readyState < 4) {\n return\n }\n const { enoughBuffer, buffers } = this._checkBuffer(currentTime, buffered)\n if (!enoughBuffer) {\n return\n }\n\n if (curDecodedFrames <= this.config.reportFrame) {\n this._currentStuckCount++\n this._payload.push({ currentTime, buffers, curDecodedFrames, totalVideoFrames, droppedVideoFrames, checkInterval })\n\n if (this._currentStuckCount >= this.config.stuckCount) {\n this.emit(Events.FPS_STUCK, this._payload)\n this._reset()\n }\n } else {\n this._reset()\n }\n }\n\n _reset () {\n this._payload = []\n this._currentStuckCount = 0\n }\n\n _checkDecodeFPS () {\n const media = this.player.media || this.player.video\n if (!media) {\n return\n }\n const { totalVideoFrames, droppedVideoFrames } = media.getVideoPlaybackQuality()\n\n const currTime = performance.now()\n if (totalVideoFrames) {\n if (this._lastCheckPoint) {\n const curDecoded = totalVideoFrames - this._lastDecodedFrames\n const checkInterval = currTime - this._lastCheckPoint\n this._checkStuck(curDecoded, totalVideoFrames, droppedVideoFrames, checkInterval)\n }\n }\n this._lastDecodedFrames = totalVideoFrames\n this._lastCheckPoint = currTime\n }\n\n destroy () {\n this._stopTick()\n }\n}\n","import sniffer from '../utils/sniffer'\n// import Danmu from '../plugins/danmu'\nimport Xglogger from '../plugins/logger'\nimport Replay from '../plugins/replay'\nimport Poster from '../plugins/poster'\nimport Start from '../plugins/start'\nimport Enter from '../plugins/enter'\nimport Miniscreen from '../plugins/miniScreen'\nimport PC from '../plugins/pc'\nimport Mobile from '../plugins/mobile'\nimport Keyboard from '../plugins/keyboard'\nimport Loading from '../plugins/loading'\nimport Progress from '../plugins/progress'\nimport PlayIcon from '../plugins/play'\nimport FullScreen from '../plugins/fullscreen'\nimport TimeIcon from '../plugins/time'\nimport TimeSegments from '../plugins/time/timesegments'\nimport Volume from '../plugins/volume'\nimport RotateIcon from '../plugins/rotate'\nimport PIPIcon from '../plugins/pip'\nimport PlayNextIcon from '../plugins/playNext'\nimport DownLoadIcon from '../plugins/download'\nimport ScreenShotIcon from '../plugins/screenShot'\nimport DefinitionIcon from '../plugins/definition'\nimport PlaybackRateIcon from '../plugins/playbackRate'\nimport CssFullScreen from '../plugins/cssFullScreen'\nimport Error from '../plugins/error'\nimport Prompt from '../plugins/prompt'\nimport ProgressPreview from '../plugins/progressPreview'\nimport Thumbnail from '../plugins/common/thumbnail'\nimport MiniProgress from '../plugins/progress/miniProgress'\nimport DynamicBg from '../plugins/dynamicBg'\nimport ZH from '../lang/zh-cn'\nimport Stats from '../plugins/stats'\nimport GapJump from '../plugins/gapJump'\nimport WaitingTimeoutJump from '../plugins/waitingTimeoutJump'\nimport TestSpeed from '../plugins/testspeed'\nimport I18N from '../lang/i18n'\nimport FpsDetect from '../plugins/fpsDetect'\n// import Heatmap from '../plugins/heatmap'\n\nI18N.use(ZH)\n\nexport default class DefaultPreset {\n constructor (options, playerConfig) {\n const simulateMode = playerConfig && playerConfig.isMobileSimulateMode === 'mobile'\n const { isLive } = playerConfig\n const vodPlugins = isLive ? [] : [TimeSegments, Progress, MiniProgress, ProgressPreview, TimeIcon]\n\n const contolsIcons = [...vodPlugins, PlayIcon, FullScreen,\n RotateIcon, PlayNextIcon, DefinitionIcon, PlaybackRateIcon, DownLoadIcon, ScreenShotIcon, Volume, PIPIcon]\n\n const layers = [Replay, Poster, Start, Loading, Enter, Error, Prompt, Thumbnail, Miniscreen]\n\n this.plugins = [Stats, Xglogger, ...contolsIcons, ...layers, GapJump, WaitingTimeoutJump]\n const mode = simulateMode ? 'mobile' : sniffer.device\n switch (mode) {\n case 'pc':\n this.plugins.push(...[Keyboard, PC, CssFullScreen, TestSpeed, FpsDetect])\n break\n case 'mobile':\n this.plugins.push(...[Mobile])\n break\n default:\n this.plugins.push(...[Keyboard, PC, CssFullScreen])\n }\n if (sniffer.os.isIpad || mode === 'pc') {\n this.plugins.push(DynamicBg)\n }\n if (sniffer.os.isIpad) {\n this.plugins.push(PC)\n }\n this.ignores = []\n this.i18n = []\n }\n}\n","export default {\n LANG: 'zh-cn',\n TEXT: {\n ERROR_TYPES: {\n network: {\n code: 1,\n msg: '视频下载错误'\n },\n mse: {\n code: 2,\n msg: '流追加错误'\n },\n parse: {\n code: 3,\n msg: '解析错误'\n },\n format: {\n code: 4,\n msg: '格式错误'\n },\n decoder: {\n code: 5,\n msg: '解码错误'\n },\n runtime: {\n code: 6,\n msg: '语法错误'\n },\n timeout: {\n code: 7,\n msg: '播放超时'\n },\n other: {\n code: 8,\n msg: '其他错误'\n }\n },\n HAVE_NOTHING: '没有关于音频/视频是否就绪的信息',\n HAVE_METADATA: '音频/视频的元数据已就绪',\n HAVE_CURRENT_DATA: '关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒',\n HAVE_FUTURE_DATA: '当前及至少下一帧的数据是可用的',\n HAVE_ENOUGH_DATA: '可用数据足以开始播放',\n NETWORK_EMPTY: '音频/视频尚未初始化',\n NETWORK_IDLE: '音频/视频是活动的且已选取资源,但并未使用网络',\n NETWORK_LOADING: '浏览器正在下载数据',\n NETWORK_NO_SOURCE: '未找到音频/视频来源',\n MEDIA_ERR_ABORTED: '取回过程被用户中止',\n MEDIA_ERR_NETWORK: '网络错误',\n MEDIA_ERR_DECODE: '解码错误',\n MEDIA_ERR_SRC_NOT_SUPPORTED: '不支持的音频/视频格式',\n REPLAY: '重播',\n ERROR: '网络连接似乎出现了问题',\n PLAY_TIPS: '播放',\n PAUSE_TIPS: '暂停',\n PLAYNEXT_TIPS: '下一集',\n DOWNLOAD_TIPS: '下载',\n ROTATE_TIPS: '旋转',\n RELOAD_TIPS: '重新载入',\n FULLSCREEN_TIPS: '进入全屏',\n EXITFULLSCREEN_TIPS: '退出全屏',\n CSSFULLSCREEN_TIPS: '进入样式全屏',\n EXITCSSFULLSCREEN_TIPS: '退出样式全屏',\n TEXTTRACK: '字幕',\n TEXTTRACK_OFF: '关闭',\n PIP: '画中画',\n SCREENSHOT: '截图',\n LIVE: '正在直播',\n OFF: '关闭',\n OPEN: '开启',\n MINI_DRAG: '点击按住可拖动视频',\n MINISCREEN: '小屏幕',\n REFRESH_TIPS: '请试试',\n REFRESH: '刷新',\n FORWARD: '快进中',\n LIVE_TIP: '直播'\n }\n}\n","import Errors from './error'\nimport * as Events from './events'\nimport './index.scss'\nimport { InstManager } from './instManager'\nimport I18N from './lang/i18n'\nimport Player from './player'\nimport BasePlugin from './plugin/basePlugin'\nimport Plugin from './plugin/plugin'\nimport { default as CssFullscreenIcon } from './plugins/cssFullScreen'\nimport { default as FullscreenIcon } from './plugins/fullscreen'\nimport { default as PlayIcon } from './plugins/play'\nimport { default as Progress } from './plugins/progress'\nimport { default as TimeIcon } from './plugins/time'\nimport { default as VolumeIcon } from './plugins/volume'\nimport defaultPreset from './presets/default'\nimport STATE_CLASS from './stateClassMap'\nimport Sniffer from './utils/sniffer'\nimport Util from './utils/util'\n\nclass PresetPlayer extends Player {\n static defaultPreset = defaultPreset;\n static Util = Util;\n static Sniffer = Sniffer\n static Errors = Errors\n static Events = Events\n static Plugin = Plugin\n static BasePlugin = BasePlugin\n static I18N = I18N\n static STATE_CLASS = STATE_CLASS\n static InstManager = InstManager\n\n // UI Exports\n static PlayIcon = PlayIcon // For Ads Plugin\n static TimeIcon = TimeIcon // For Ads Plugin\n static Progress = Progress // For Ads Plugin\n static FullscreenIcon = FullscreenIcon // For Ads Plugin\n static CssFullscreenIcon = CssFullscreenIcon // For Ads Plugin\n static VolumeIcon = VolumeIcon // For Ads Plugin\n}\n\nexport default PresetPlayer\n"],"names":["version","XG_DEBUG_OPEN","window","location","href","indexOf","STYLE","info","error","warn","XGTAG","XG_DEBUG","config","debug","logInfo","message","_console","_len","arguments","length","optionalParams","Array","_key","this","console","log","apply","concat","logWarn","_console2","_len2","_key2","logError","_console3","_fun","_len3","_key3","XgplayerTimeRange","bufferedList","_classCallCheck","_createClass","key","value","index","start","end","get","util","checkIsIn","list","i","len","isObject","type","_typeof","debounce","func","wait","options","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","useRAF","requestAnimationFrame","TypeError","invokeFunc","time","args","thisArg","undefined","startTimer","pendingFunc","cancelAnimationFrame","setTimeout","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","Date","now","trailingEdge","timeSinceLastInvoke","timeWaiting","Math","min","remainingWait","debounced","isInvoking","max","cancel","id","clearTimeout","cancelTimer","flush","pending","createDom","el","tpl","attrs","cname","dom","document","createElement","className","innerHTML","Object","keys","forEach","item","setAttribute","createDomFromHtml","html","classname","doc","children","addClass","err","hasClass","prototype","some","call","classList","e","orgClassName","getAttribute","match","RegExp","replace","split","add","removeClass","remove","reg","toggleClass","classNames","_arguments","_loop","typeOf","push","map","join","findDom","sel","querySelector","getElementById","slice","getCss","currentStyle","defaultView","getComputedStyle","padStart","str","pad","charstr","String","maxlen","ceil","chars","r","substring","format","isNaN","round","hour","floor","minute","second","event","touches","touch","changedTouches","clientX","clientY","offsetX","pageX","target","offsetLeft","offsetY","pageY","offsetTop","_target","srcElement","obj","toString","deepCopy","dst","src","Node","deepMerge","_dst$key","_toConsumableArray","getBgImage","url","backgroundImage","a","copyDom","nodeType","back","tagName","attributes","node","name","setInterval","context","eventName","intervalFunc","frequency","_interval","bind","clearInterval","fun","_timers","splice","clearAllTimers","_timerIds","createImgBtn","imgUrl","width","height","w","h","unit","btn","style","every","parseFloat","trim","backgroundSize","margin","Hex2RGBA","hex","alpha","rgb","test","sixHex","kw","parseInt","getFullScreenEl","fullscreenElement","webkitFullscreenElement","mozFullScreenElement","msFullscreenElement","checkIsFunction","checkIsObject","hide","display","show","isUndefined","val","isNotNull","setStyleFromCsstext","text","arr","filterStyleFromText","_cssText","cssText","styleArr","ret","remain","getStyleFromCsstext","preloadImg","onload","onerror","img","Image","stopPropagation","scrollTop","pageYOffset","documentElement","body","scrollLeft","pageXOffset","checkTouchSupport","getBuffered2","vbuffered","maxHoleDuration","buffered","sort","b","diff","buffered2","buf2len","buf2end","getEventPos","zoom","x","y","callback","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","getHostFromUrl","results","domain","frameId","mozCancelAnimationFrame","cancelRequestAnimationFrame","isMSE","video","media","HTMLMediaElement","currentSrc","isBlob","generateSessionId","did","d","getTime","performance","uuid","c","random","createEvent","Event","initEvent","adjustTimeByDuration","duration","isEnded","createPositionBar","root","appendChild","getTransformStyle","pos","scale","rotate","transformValue","styles","translate","stylesKeys","fn","lastIndex","convertDeg","abs","getIndexByTime","segments","_index","getOffsetCurrentTime","currentTime","_segments$_index","cTime","offset","getCurrentTimeByOffset","offsetTime","ERROR_TYPE_MAP","ERROR_MAP","Errors","player","errorInfo","errorType","errorCode","errorMessage","originError","ext","mediaError","ERROR_TYPES","i18n","ended","_player$media","readyState","networkState","_errc","code","playerVersion","stack","host","Util","ex","msg","PLAY","PLAYING","ENDED","PAUSE","ERROR","SEEKING","SEEKED","TIME_UPDATE","WAITING","CANPLAY","DURATION_CHANGE","VOLUME_CHANGE","LOADED_DATA","RATE_CHANGE","PROGRESS","LOAD_START","EMPTIED","PLAYER_FOCUS","PLAYER_BLUR","READY","URL_NULL","AUTOPLAY_STARTED","AUTOPLAY_PREVENTED","COMPLETE","REPLAY","DESTROY","URL_CHANGE","DOWNLOAD_SPEED_CHANGE","LEAVE_PLAYER","ENTER_PLAYER","LOADING","FULLSCREEN_CHANGE","CSS_FULLSCREEN_CHANGE","MINI_STATE_CHANGE","DEFINITION_CHANGE","AFTER_DEFINITION_CHANGE","VIDEO_RESIZE","PIP_CHANGE","ROTATE","SCREEN_SHOT","PLAYNEXT","SHORTCUT","XGLOG","USER_ACTION","RESET","SOURCE_ERROR","SOURCE_SUCCESS","VIDEO_EVENTS","STATS_EVENTS","STATS_INFO","STATS_DOWNLOAD","STATS_RESET","FPS_STUCK","has","hasOwnProperty","prefix","Events","EE","once","addListener","emitter","listener","evt","_events","_eventsCount","clearEvent","EventEmitter","create","__proto__","eventNames","names","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","j","on","removeAllListeners","off","prefixed","module","exports","store","instance","InstManager","_EventEmitter","_inherits","_super","_createSuper","playerId","setActive","isUserActive","endEarly","_iterate","flag","isActive","inst","isInstNext","isNext","XGI18nLang","lang","langKeys","textKeys","_s","_t","updateKeys","en","use","langData","i18nLangs","_clang","LANG","texts","TEXT","network","mse","parse","decoder","runtime","timeout","other","HAVE_NOTHING","HAVE_METADATA","HAVE_CURRENT_DATA","HAVE_FUTURE_DATA","HAVE_ENOUGH_DATA","NETWORK_EMPTY","NETWORK_IDLE","NETWORK_LOADING","NETWORK_NO_SOURCE","MEDIA_ERR_ABORTED","MEDIA_ERR_NETWORK","MEDIA_ERR_DECODE","MEDIA_ERR_SRC_NOT_SUPPORTED","PLAY_TIPS","PAUSE_TIPS","PLAYNEXT_TIPS","DOWNLOAD_TIPS","ROTATE_TIPS","RELOAD_TIPS","FULLSCREEN_TIPS","EXITFULLSCREEN_TIPS","CSSFULLSCREEN_TIPS","EXITCSSFULLSCREEN_TIPS","TEXTTRACK","TEXTTRACK_OFF","PIP","SCREENSHOT","LIVE","OFF","OPEN","MINI_DRAG","MINISCREEN","REFRESH_TIPS","REFRESH","FORWARD","LIVE_TIP","I18N","zh","extend","i18nTextList","_i18nLangs","init","_ret$langKeys","pId","VERSION_REG","H264_MIMETYPES","sniffer","device","os","isPc","browser","navigator","ua","userAgent","toLowerCase","ie","firefox","chrome","opera","safari","filter","isWindowsPhone","isSymbian","isTizen","isWebOS","isHarmonyOS","isAndroid","isFireFox","isIpad","platform","maxTouchPoints","isTablet","isPhone","isIos","osVersion","_match","exec","isWeixin","toLocaleLowerCase","isSupportMP4","isSupport","mime","supportResult","canPlayType","isMSESupport","MediaSource","isTypeSupported","_logger","isHevcSupported","probeConfigSupported","defaults","supported","smooth","powerEfficient","Promise","resolve","mediaCapabilities","decodingInfo","videoConfig","audioConfig","audio","videoSupported","contentType","audioSupported","emitVideoEvent","eventKey","errorHandler","getVideoEventHandler","_err","eData","originalEvent","detail","timeStamp","paused","isInternalOp","_internalOp","muted","volume","vtype","removeInnerOP","_currentTime","_rate","playbackRate","_duration","isMutedChange","_lastMuted","mediaEventMiddleware","MediaProxy","_this","_hasStart","mediaConfig","assign","controls","autoplay","playsinline","x5VideoPlayerFullscreen","x5VideoOrientation","airplay","tabindex","mediaType","videoAttributes","playerType","x5VideoPlayerType","Sniffer","loop","autoplayMuted","mediaEl","defaultPlaybackRate","attachVideoEvents","middlewares","_this2","_this3","_this4","_evHandlers","funName","charAt","toUpperCase","_defineProperty","addEventListener","_this5","removeEventListener","urls","_this6","removeAttribute","load","_c","_videoSourceCount","_videoSourceIndex","_vLoadeddata","_eHandler","_sourceError","_dIndex","removeChild","_e","srcObject","k","pause","detachVideoEvents","set","play","range","isTrue","_buffered","crossOrigin","defaultMuted","rate","Infinity","played","preload","seekable","seeking","onWaiting","_detachSourceEvents","_attachSourceEvents","vol","videoWidth","videoHeight","data","_get2","_get","_getPrototypeOf","_get3","_get4","_get5","_len4","_key4","INDEXDB","mydb","db","ojstore","keypath","indexedDB","webkitindexedDB","IDBKeyRange","webkitIDBKeyRange","myDB","self","request","open","onsuccess","onupgradeneeded","transaction","objectStoreNames","contains","createObjectStore","keyPath","deleteDatabase","close","storename","objectStore","put","delete","clear","FULLSCREEN_EVENTS","GET_FULLSCREEN_API","EXIT_FULLSCREEN_API","PLATER_ID","callHandler","handler","next","then","hook","hookName","preset","pre","__hooks","_preset$pre","pluginName","preRet","runHooks","isContinue","catch","findHookIndex","isArray","hookHandlers","useHooks","removeHooks","hooks","usePluginHooks","plugins","plugin","removePluginHooks","hooksDescriptor","presetHooks","defineProperty","delHooksDescriptor","_len5","_key5","runHooksRecursive","_len6","_key6","showErrorMsg","BasePlugin","beforeCreate","__args","__events","__onceEvents","playerConfig","__init","constructor","logger","i18nKeys","domEventType","_this$player","res","action","params","nParams","_objectSpread","emitUserAction","registerPlugin","getPlugin","offAll","destroy","unRegisterPlugin","Obj","configurable","Element","matches","proto","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","closest","element","selector","parentNode","_delegate","useCapture","listenerFn","delegateTarget","delegate_1","elements","querySelectorAll","ROOT_TYPES","CONTROLS","ROOT","POSITIONS","ROOT_LEFT","ROOT_RIGHT","ROOT_TOP","CONTROLS_LEFT","CONTROLS_RIGTH","CONTROLS_RIGHT","CONTROLS_CENTER","PLUGIN_STATE_CLASS","isUrl","createIcon","icon","attr","newIcon","tag","registerIconsObj","iconsConfig","_icons","icons","orgIcon","class","mergeIconClass","mergeIconAttr","Plugin","_BasePlugin","__delegates","_parent","_el","parent","extraEls","registerIcons","langText","textConfig","defaultTexConfig","registerLanguageTexts","renderStr","render","Error","insert","setAttr","setStyle","__registerChildren","_children","_plugin","checkChildren","langKey","langTextShow","disable","find","qs","eventType","bindEL","delegate","unbindEL","htmlStr","eventHandle","isBubble","getPropertyValue","pdom","child","_this7","insertIdx","Number","isDomElement","coordinate","mode","curIdx","insertBefore","insertAdjacentHTML","capture","dels","ResizeObserver","entries","t","__runHandler","__handlers","observer","throttle","__trigger","observe","_pid","_this$observer","unobserve","_this$observer2","disconnect","resizeObserver","pluginsManager","pluginGroup","cgid","_pluginInfoId","closeResizeObserver","resize","addObserver","_originalOptions","_plugins","formatPluginInfo","PLUFGIN","checkPluginIfExits","getRootByConfig","_pConfig","position","lazyRegister","lazyPlugin","race","loader","__esModule","default","register","reject","originalOptions","isSupported","codecType","defaultConfig","unRegister","_instance","afterCreate","__destroy","deletePlugin","getPlugins","findPlugin","cName","beforeInit","retPromise","prevTask","_loadingPlugins","all","pluginsRet","pName","beforePlayerInit","afterInit","afterPlayerInit","setLang","updateLang","reRender","_pList","onPluginsReady","unObserver","_resizeObserver","_i","_Object$keys","STATE_CLASS","DEFAULT","DEFAULT_SKIN","ENTER","PAUSED","NO_START","ACTIVE","INACTIVE","FULLSCREEN","CSS_FULLSCREEN","ROTATE_FULLSCREEN","PARENT_ROTATE_FULLSCREEN","PARENT_FULLSCREEN","INNER_FULLSCREEN","NO_CONTROLS","FLEX_CONTROLS","CONTROLS_FOLLOW","CONTROLS_AUTOHIDE","TOP_BAR_AUTOHIDE","NOT_ALLOW_AUTOPLAY","PC","MOBILE","MINI","getDefaultConfig","nullUrlStart","fluid","fitVideoSize","videoFillMode","isLive","videoInit","poster","isMobileSimulateMode","execBeforePluginsCall","allowSeekAfterEnded","enableContextmenu","closeVideoClick","closeVideoDblclick","closePlayerBlur","closeDelayBlur","leavePlayerTime","closePlayVideoFocus","closePauseVideoFocus","closeFocusVideoFocus","closeControlsBlur","topBarAutoHide","startTime","seekedStatus","miniprogress","disableSwipeHandler","enableSwipeHandler","preProcessUrl","ignores","whitelist","inactive","language","marginControls","fullscreenTarget","screenShot","pip","download","mini","cssFullscreen","keyShortcut","presets","definition","customDuration","timeOffset","thumbnail","isHideTips","minWaitDelay","commonStyle","progressColor","playedColor","cachedColor","sliderBtnStyle","volumeColor","STATES","STATE_ARRAY","Controls","_Plugin","_assertThisInitialized","_assertThisInitialize","focus","autoHide","_this$config","left","center","right","innerRoot","isMini","onMouseEnter","onMouseLeave","blur","ignorePaused","unbind","_this$config2","initShow","PLAYER_HOOKS","REAL_TIME_SPEED","AVG_SPEED","instManager","Player","_MediaProxy","_this$onReady","__startTime","_seekToStartTime","_useAutoplay","mediaPlay","canPlayFunc","isFullScreen","delayResize","fullEl","_fullActionFrom","props","prop","from","to","isVideo","checkIsCurrentVideo","pid","_fullscreenEl","fullscreen","changeFullStyle","_fullScreenOffset","cssfullscreen","exitCssFullscreen","needFullscreenScroll","scrollTo","top","recoverFullStyle","onFullscreenChange","defaultPreset","defaultIdx","userTimer","waitTimer","handleSource","_state","isAd","isError","isSeeking","isCanplay","rotateDeg","isRotateFullscreen","timeSegments","_cssfullscreenEl","curDefinition","_orgCss","_videoHeight","_videoWidth","videoPos","pi","vy","vx","sizeInfo","_accPlayed","acc","loopAcc","_offsetInfo","innerContainer","topBar","__i18n","database","Database","_onceSeekCanplay","_isPauseBeforeSeek","innerStates","isActiveLocked","_initDOM","_possibleConstructorReturn","_this$config2$definit","defaultDefinition","_bindEvents","_registerPresets","_registerPlugins","getInitDefinition","setState","onReady","hasStart","state","_instManager","vid","line","handle","p","checkPlayerRoot","_initBaseDoms","_root","_this$config3","_width","_height","_this$root$getBoundin","getBoundingClientRect","leftBar","rightBar","_onWebkitbeginfullscreen","_onWebkitendfullscreen","playFunc","mousemoveFunc","playSessionId","_playSessionId","firstChild","isInit","ignoresStr","cuPlugins","lazy","loadingPlugin","forceBeforeInit","_this8","Preset","_player$config$plugin","_player$config$ignore","_presetInst","_presetInst$plugins","_presetInst$ignores","_presetInst$icons","_presetInst$i18n","_ci18n","usePreset","_retPlugin","_this$controls","_getRootByPosition","removedFromConfig","deregister","removePluginFromConfig","_this9","_furl","_startInit","fileName","lineNumber","_this10","_src","curTime","isPaused","_error","_canplay","_this11","playPromise","onError","_errorTimer","_this12","_this13","status","_this14","_this$config4","isSeekedPlay","_status","_this15","_this$config5","_this16","bitrate","switchURL","seamless","reloadFunc","_this17","clsList","mediaPause","cls","_this18","unregisterPlugins","isResetConfig","resetState","pn","de","_instManager2","_this19","updateAcc","_unbindEvents","exitFullscreen","remainMediaAfterDestroy","cList","_this20","onPlay","_this21","cur","_srcRet","rootClass","pClassName","_orgPCss","webkitRequestFullscreen","ALLOW_KEYBOARD_INPUT","fullscreenEnabled","webkitSupportsFullscreen","webkitEnterFullscreen","exitRotateFullscreen","webkitExitFullScreen","_class","_this$config$fullscre","useCssFullscreen","_this$config$fullscre2","setRotateDeg","_rootStyle","isRotate90","orientation","screen","angle","innerWidth","innerHeight","deg","delay","onFocus","_clearUserTimer","onBlur","_this22","isLock","_ref","_ref$ignorePaused","_this23","_this24","_this25","endType","_at","startDiff","endDiff","_ref2","_ref2$startDiff","_ref2$endDiff","_this26","_this$videoPos","_pi","_pos","offsetWidth","offsetHeight","rHeight","rWidth","maxWidth","maxHeight","formStyle","transform","webkitTransform","resizePosition","_this27","setConfig","_this28","_this29","containerSize","_this$media","_this$config6","controlsHeight","videoFit","fit","_style","paddingTop","videoScale","vWidth","vHeight","cWidth","cHeight","updateObjectPosition","objectPosition","newState","_this$config7","preProcessUrlOptions","processUrlOptions","bool","_this30","curDef","targetDef","_this30$curDefinition","changeDefinition","total","dropped","corrupted","droppedRate","droppedDuration","getVideoPlaybackQuality","_quality","droppedVideoFrames","totalVideoFrames","corruptedVideoFrames","cumulateTime","_l","__url","posterUrl","update","_this$_accPlayed","isMuted","_instManager3","addInnerOP","Boolean","_instManager4","getActiveId","_instManager5","descriptor","xgIconTips","textKey","isShow","getInstance","Icon","_onMouseenter","_onMouseLeave","CssFullScreen","_IconPlugin","initIcons","isCssfullScreen","animate","btnClick","handleCssFullscreen","preventDefault","contentIcon","getCssFullscreen","switchTips","tipDom","changeLangTextKey","CssFullSceenSvg","ExitCssFullSceenSvg","IconPlugin","TopBackIcon","onClick","screenBack","BackSVG","Fullscreen","rotateFullscreen","getFullscreen","handleFullscreen","toggleFullScreen","tipsDom","needBackIcon","topBackIcon","_onOrientationChange","FullScreenSvg","ExitFullScreenSvg","getRotateFullscreen","switchCallback","useScreenOrientation","unlockScreen","aspectRatio","lockScreen","lockOrientationType","lock","unlock","Play","replay","listenEvents","PlaySvg","PauseSvg","TPL","styleKey","InnerList","fragments","percent","_callBack","actionCallback","fragConfig","fragFocusClass","fragAutoFocus","fragClass","cachedIndex","playedIndex","focusIndex","newIndex","curIndex","millisecond","progressList","curPFrag","per","newPIndex","findIndex","unHightLight","setHightLight","_data","preIndex","fragment","cached","updateDuration","updateProgress","newCIndex","newOptions","_this$fragConfig","inner","isFocus","FRAGMENT_FOCUS_CLASS","POINT","HIGHLIGHT","Progress","_ePos","moving","miniMoveStep","computeTime","triggerCallbacks","_updateInnerFocus","isLocked","updateWidth","seekTime","_assertThisInitialize3","forward","isDown","isPauseMoving","_assertThisInitialize4","closeMoveSeek","isPlaying","onMoveStart","prePlayTime","isProgressMoving","progressBtn","_mouseDownHandlerHook","onMouseMove","onMouseUp","onMoveOnly","_addDragDocumentEvents","_assertThisInitialize5","onMoveEnd","_mouseUpHandlerHook","_removeDragDocumentEvents","isEnter","resetSeekState","_assertThisInitialize6","miniStartStep","_mouseMoveHandlerHook","_assertThisInitialize7","_this$pos","useable","__dragCallBacks","direc","_disableBlur","isDragingSeek","isDraggingSeek","offsetDuration","offsetCurrentTime","innerList","reset","outer","updateFocus","_initInner","isMobile","bindDomEvents","initCustomStyle","onTimeupdate","onCacheUpdate","onReset","onVideoResize","frags","boxShadow","_mouseDownHandler","_mouseUpHandler","_mouseMoveHandler","onMouseDown","onMouseOver","onMouseOut","onBodyClick","_this$root","ownerDocument","dragDocument","_getRootDocument","_dragDocument","pauseAutoHide","recoverAutoHide","isCloseClickSeek","realTime","endedDiff","toFixed","updatePercent","updateTime","seek","rLeft","timeIcon","resetActive","notSeek","_end","bufferedPoint","thumbnailPlugin","controlsMode","Time","isActiving","_this$player2","constrolsMode","createCenterTime","durationDom","timeDom","onTimeUpdate","centerCurDom","centerDurDom","current","minWidthTime","timeStr","updateState","Volume","bar","barRect","barH","updateVolumePos","onBarMouseUp","_d","isStart","isMoving","unFocus","showValueLabel","updateVolumeValue","volumeSmall","volumeSmallSvg","volumeLarge","volumeLargeSvg","volumeMuted","volumeMutedSvg","_timerId","_this$playerConfig","backgroundColor","changeMutedHandler","changeMuted","_onMouseenterHandler","onMouseenter","_onMouseleaveHandler","onMouseleave","onBarMousedown","onBarMouseMove","onVolumeChange","drag","$labelValue","innerText","isForce","miniVolume","isShowVolumeValue","LOG_TYPES","XGLogger","isTimeUpdate","autoplayStart","_sendFF","vt","isFFLoading","isFFSend","isLs","pt","fvt","newPointTime","loadedCostTime","startCostTime","_isSeeking","seekingStart","waitingStart","fixedWaitingStart","_isWaiting","_waitTimer","_waittTimer","_waitType","suspendWaitingStatus","emitLog","suspendSeekingStatus","fixedStart","_startWaitTimeout","_onReset","_initOnceEvents","_onWaitingLoadStart","_this2$_state","_onSeeking","_onSeeked","endState","_onPlaying","_onWaiting","_onError","_onAutoplayStart","_onTimeupdate","s","_this$_state","costTime","waitTimeout","_now","_cost","_fixedCost","fixedCostTime","Replay","ReplaySvg","__handleReplay","path","Poster","isEndedShow","isHide","useVideoPoster","hideCanplay","_bg","fillMode","notHidden","getBgSize","AnimateMap","clearAnimation","Start","autoPlayStart","toggleTo","bindClickEvents","onAutoplayStart","onPlayerReset","clickHandler","switchPausePlay","cancelable","startPlay","startPause","isAnimate","endShow","_animateId","addAnimate","seconds","switchStatus","isShowPause","isShowEnd","endAnimate","disableAnimate","Enter","innerHtml","HTMLElement","barStr","logo","MiniScreenIcon","getMini","exitMini","getStyleSize","num","measurements","measurementsLength","getSize","elem","getStyle","size","outerWidth","outerHeight","getZeroSize","isBorderBox","boxSizing","measurement","paddingWidth","paddingLeft","paddingRight","paddingHeight","paddingBottom","marginWidth","marginLeft","marginRight","marginHeight","marginTop","marginBottom","borderWidth","borderLeftWidth","borderRightWidth","borderHeight","borderTopWidth","borderBottomWidth","isBorderBoxSizeOuter","styleWidth","styleHeight","getTouch","dentifier","identifier","EVENTS","POST_START_EVENTS","mousedown","touchstart","pointerdown","Draggabilly","isEnabled","isDragging","downPoint","dragPoint","startPos","_handlerDom","_bindStartEvent","_startKey","_boundPointerEvents","onUp","positionDrag","webKitTransform","dragStart","dragMove","dragEnd","touchIdentifier","pointerId","dragCancel","pointer","_getPosition","maxY","maxX","setLeftTop","_bindPostStartEvents","_unbindPostStartEvents","presetInfo","moveVector","hasDragStarted","dragRealStart","_this$startPos","_dragPointerMove","dragX","dragY","checkContain","_unbindStartEvent","axis","grid","_getPositionCoord","_addTransformPosition","matrixValues","xIndex","translateX","translateY","styleSide","measure","parentSize","MiniScreen","isClose","scrollY","scrollHeight","lastStyle","isShowIcon","onCancelClick","onCenterClick","disableDrag","_draggabilly","isScrollSwitch","onScroll","PlayIcon","PauseIcon","MOUSE_EVENTS","mouseenter","mouseleave","mousemove","HOOKS","PCPlugin","_isMobileTouchActive","stopImmediatePropagation","_assertThisInitialize2","__canvas","closeVideoStopPropagation","_clickCount","clickTimer","switchPlayPause","initEvents","onVideoClick","onVideoDblClick","onContextmenu","_this$player2$plugins","mobilePlugin","mobile","_isTouchActive","returnValue","cancelBubble","_this$player3","TOUCHS","move","MOUSES","Touche","__setPress","onTouchEnd","onTouchCancel","onTouchMove","trigger","__clearPress","press","__setDb","diffx","diffy","miniStep","pressDelay","dbClickDelay","disablePress","disableDbClick","needPreventDefault","pressIntrvalId","dbIntrvalId","_initEvent","onTouchStart","__clearDb","touchend","touchmove","ACTIONS","MobilePlugin","touche","getTouche","touchActiveTimer","disableGesture","timer","rect","_x","_y","scopeL","scopeR","scopeM1","scopeM","scopeM2","hideControlsActive","scope","checkScope","gestureY","gestureX","executeMove","endLastMove","resetPos","changeAction","checkIsRootTarget","light","seekTipIcon","SeekTipIcon","closedbClick","xgMask","registerThumbnail","onRootTouchMove","onRootTouchEnd","moveDuration","_this2$pos","eventsMap","pressend","click","doubleclick","disableActive","progressPlugin","progress","addCallBack","activeSeekNote","usable","createThumbnail","timePreview","timePreviewStyle","curTimeColor","durationColor","previewDom","curColor","durColor","color","disableTimeProgress","startPlugin","recover","mold","updateBrightness","updateVolume","lastScope","hideControlsEnd","sendUseAction","focusVideoClick","dbClickHandler","pressRate","isTouchingSeek","darkness","maxDarkness","isForward","focusHide","updateThumbnails","gradient","disableSeekIcon","miniYPer","isDisableTag","isContentEditable","Keyboard","keyCode","_keyState","disableBodyTrigger","isIgnoreUserActive","checkIsVisible","metaKey","altKey","ctrlKey","isBodyKeyDown","repeat","isKeyDown","isGlobalTrigger","checkCode","onBodyKeyUp","handleKeyDown","handleKeyUp","disableRootTrigger","onKeyup","extendkeyCodeMap","keyCodeMap","key1","seekStep","space","noBodyTarget","up","down","pressAction","esc","mergekeyCodeMap","isPress","tt","onKeydown","onBodyKeyDown","newConfig","checkVisible","rec","bottom","isBodyTarget","_time","_step","_seekTime","handleKeyCode","curKeyCode","_this$keyCodeMap$arr$","_action","Loading","loadingIcon","TimeSegmentsControls","updateSegments","_checkIfEnabled","changeIndex","curPos","lastCurrentTime","_this$curPos","getSeekTime","_this$player4","_onDurationChange","_onLoadedData","_onPlay","_segs","formatTimeSegments","_item","_segDuration","segDuration","last","_timeSegments$index","diff2","Rotate","onBtnClick","_clickTimeStamp","innerRotate","updateRotateDeg","rootWidth","clientWidth","rootHeight","clientHeight","clockwise","videoRotateDeg","_transform","_styles","transformOrigin","times","factor","RotateSvg","PresentationMode","isPIPAvailable","isPip","exitPIP","requestPIP","showIcon","pMode","initPipEvents","switchPIP","pipIcon","PipIcon","pipIconExit","PipIconExit","leavePIPCallback","pipWindow","enterPIPCallback","pictureInPictureWindow","onWebkitpresentationmodechanged","webkitPresentationMode","checkWebkitSetPresentationMode","pipWin","textContent","styleSheets","cssRules","rule","link","rel","head","preferDocument","isDocPIPAvailable","pipOptions","playerRect","documentPictureInPicture","requestWindow","docPiPNode","docPiPStyle","pipRoot","parentElement","previousSibling","nextSibling","copyStyleIntoPiPWindow","append","cssContent","_player$plugins","_player$plugins$progr","_player$plugins$progr2","resetDragState","webkitSetPresentationMode","requestPictureInPicture","reason","_documentPictureInPic","exitPictureInPicture","_documentPictureInPic2","pictureInPictureElement","pictureInPictureEnabled","disablePictureInPicture","webkitSupportsPresentationMode","protocol","PlayNextIcon","idx","urlList","nextHandler","playNext","Next","changeSrc","DEFAULT_CONFIG","mimeType","BrowserUtils","Blob","URL","createObjectURL","msSaveBlob","DataURLUtils","dataURL","parts","binData","atob","decodeURIComponent","pop","uiArr","Uint8Array","charCodeAt","MozBlob","WebKitBlob","opts","DownloadUtils","downloadWithAnchor","anchor","startsWith","revokeObjectURL","downloadWithSafari","reader","FileReader","readAsDataURL","confirm","downloadWithIframe","iframe","RequestUtils","createRequest","xhr","XMLHttpRequest","withCredentials","setHeaders","headers","_slicedToArray","setRequestHeader","downloadFromURL","responseType","saveAs","response","statusText","ontimeout","beforeRequest","send","fileNameOrOptions","blob","actualMimeType","temp","extractedFileName","uint8Array","objectURL","btoa","encodeURIComponent","Download","dUrl","newUrl","getAbsoluteURL","saveAsOptions","_handler","DownloadSvg","div","ScreenShot","screenshotIcon","initSize","fitVideo","onClickBtn","filename","saveLink","MouseEvent","bubbles","view","initMouseEvent","dispatchEvent","canvas","canvasCtx","getContext","imageSmoothingEnabled","imageSmoothingQuality","shot","saveImg","saveScreenShot","option","quality","createCanvas","dx","dy","dw","dh","mediaRatio","canvasRatio","sw","sh","drawImage","toDataURL","OptionList","onItemClick","renderItemList","_delegates","attrKeys","selected","showText","changeCallback","curSelected","getAttrObj","LIST_TYPES","TOGGLE_MODES","IS_MOBILE","OptionsIcon","switchActiveState","toggleMode","toggle","listType","enterType","isIcons","curValue","hidePortrait","_resizeList","optionsList","activeEvent","onEnter","onLeave","onIconClick","_isIcons","focusAwhile","curItem","changeCurrentText","isItemClickHide","getTextByLang","itemList","_maxH","heightLimit","listStyle","DefinitionIcon","_OptionsIcon","changeDefinitionList","definitionList","items","showItem","PlaybackRate","curRate","itemInfo","_text","ErrorPlugin","errorRetry","handleError","retry","errorNote","Prompt","intervalId","customConfig","customOnClick","showPrompt","hidePrompt","interval","highlight","hideinterval","ISPOT","mergeISPOT","iSpot","APIS","_updateDotDom","dotDom","calcuPosition","initDots","_ispots","createDot","ispotsInit","isNew","template","positionDot","findDot","updateDot","needShow","dot","showDot","deleteDot","del","deleteAllDots","dotDoms","getElementsByTagName","updateAllDots","iSpots","ispot","positionDots","playerSize","_pop","pRect","rect1","_left","_diff","getAllDotsDom","getDotDom","CALLBACK_MAP","dragmove","dragstart","dragend","mouseover","ProgressPreview","isHideThumbnailHover","f","isDrag","_curDot","onDotMouseLeave","blurDot","enableBlur","focusDot","disableBlur","videoPreview","videothumbnail","handlerSpotClick","_event","transformTimeHook","setTimeContent","ispots","progressDot","initDotsAPI","extTextRoot","previewLine","timePoint","timeText","tipText","_hasThumnail","bindEvents","onMousemove","onMousedown","onMouseup","handlerPreviewClick","updatePosition","cwidth","isflex","lwidth","showTips","isFocusDots","defaultText","hideTips","updateTimeText","updateLinePos","thumbnailConfig","isShowThumbnail","tRoot","isShowCoverPreview","totalWidth","widthPerSeconds","_activeDotId","isDefault","removeCallBack","miniWidth","Thumbnail","ratio","_preloadMark","initThumbnail","_this2$config","pic_num","containerWidth","containerHeight","row","col","urlIndex","indexInPage","rowIndex","colIndex","swidth","sHeight","getUrlByIndex","backgroundPosition","customStyle","getPosition","getBgColor","MiniProgress","MODES","nowTime","isSupportCanvas","DynamicBg","_frameCount","startFrameCount","stop","renderOnTimeupdate","visibilityState","_checkIfCanStart","renderOnce","_isLoaded","startInterval","_sVideo","checkVideoIsSupport","videoPI","preTime","_loopType","dynamicBg","frameRate","rwidth","rheight","renderByPoster","onLoadedData","onVisibilitychange","canvasFilter","supportCanvasFilter","isInnerRender","webkitFilter","mask","addMask","background","maskBg","_p","_tVideo","HTMLVideoElement","flyVideo","_tagName","updateImg","_this$canvas$getBound","image","sourcePI","_this$canvas$getBound2","multiple","checkIsSupportCanvas","INFO","Stats","actionData","_getTime","payload","_stats","stats","getStats","JSON","stringify","downloadUrl","disabled","timestamp","timeFormat","toISOString","_recordUserActions","_recordInfo","_downloadStats","profile","_infoProfile","_info","startMs","endMs","cat","dur","ph","tid","ts","_this$_stats","mediaElem","mediaInfo","raw","timestat","_getTimeStats","_getProfile","msgs","stat","traceEvents","GapJump","seekingEventReceived","hasPlayed","smallGapLimit","gapDetectionThreshold","_getIndex","jumpTo","jumpSize","isGapSmall","BROWSER_GAP_TOLERANCE","useGapJump","isSafari","end_type","video_postion","onGapJump","threshold","bufferedInfo","_getBuffered","WaitingTimeoutJump","jumpCnt","jumpCntMax","useWaitingTimeoutJump","onJump","waitingTime","DEFAULT_SPEED_TYPE","SPEED_TYPE","TestSpeed","speedListCache","initSpeedList","cnt","testSpeed","testTimeStep","speed","appendList","openSpeed","loadSize","testCnt","testSpeedUrl","Range","onreadystatechange","getResponseHeader","saveSpeedMax","shift","realTimeSpeed","getSpeedName","updateSpeed","getSpeed","avgSpeed","speedName","addSpeedTypeList","_onRealSpeedChange","namePrefix","FpsDetect","_lastDecodedFrames","_currentStuckCount","_lastCheckPoint","_payload","_startTick","_stopTick","_timer","_checkDecodeFPS","tick","enoughBuffer","buffers","curDecodedFrames","checkInterval","hidden","_this$_checkBuffer","_checkBuffer","reportFrame","stuckCount","_reset","_media$getVideoPlayba","currTime","curDecoded","_checkStuck","DefaultPreset","_this$plugins","_this$plugins2","_this$plugins3","simulateMode","contolsIcons","TimeSegments","TimeIcon","FullScreen","RotateIcon","PlaybackRateIcon","DownLoadIcon","ScreenShotIcon","PIPIcon","layers","Miniscreen","Xglogger","Mobile","PresetPlayer","_Player","FullscreenIcon","CssFullscreenIcon","VolumeIcon"],"mappings":"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"}
|