diff --git a/docs/uncompiled/artplayer-plugin-danmuku.js b/docs/uncompiled/artplayer-plugin-danmuku.js index 809ccc8cd..36e189589 100644 --- a/docs/uncompiled/artplayer-plugin-danmuku.js +++ b/docs/uncompiled/artplayer-plugin-danmuku.js @@ -4,101 +4,6 @@ (global = global || self, global.artplayerPluginDanmuku = factory()); }(this, function () { 'use strict'; - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - var arrayWithHoles = _arrayWithHoles; - - function _iterableToArrayLimit(arr, i) { - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - var iterableToArrayLimit = _iterableToArrayLimit; - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance"); - } - - var nonIterableRest = _nonIterableRest; - - function _slicedToArray(arr, i) { - return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); - } - - var slicedToArray = _slicedToArray; - - function bilibiliDanmuParseFromXml(xmlString) { - if (typeof xmlString !== 'string') return []; - var srtList = xmlString.match(/[\S ]*?)<\/d>/gi); - return srtList.length ? srtList.map(function (item) { - var _item$match = item.match(/(.+)<\/d>/), - _item$match2 = slicedToArray(_item$match, 3), - attrStr = _item$match2[1], - text = _item$match2[2]; - - var attr = attrStr.split(','); - return attr.length === 8 && text.trim() ? { - text: text, - time: Number(attr[0]), - mode: Number(attr[1]), - fontSize: Number(attr[2]), - color: "#".concat(Number(attr[3]).toString(16)), - timestamp: Number(attr[4]), - pool: Number(attr[5]), - userID: attr[6], - rowID: Number(attr[7]) - } : null; - }) : []; - } - function bilibiliDanmuParseFromUrl(url) { - return fetch(url).then(function (res) { - return res.text(); - }).then(function (xmlString) { - return bilibiliDanmuParseFromXml(xmlString); - }); - } - function bilibiliDanmuParseFromAv(av) { - var corsUrl = 'https://cors-anywhere.herokuapp.com/'; - return fetch("".concat(corsUrl, "https://api.bilibili.com/x/web-interface/view?aid=").concat(av)).then(function (res) { - return res.json(); - }).then(function (res) { - if (res.code === 0 && res.data && res.data.cid) { - return bilibiliDanmuParseFromUrl("".concat(corsUrl, "https://api.bilibili.com/x/v1/dm/list.so?oid=").concat(res.data.cid)); - } - - throw new Error("Unable to get data: ".concat(JSON.stringify(res))); - }); - } - - var bilibili = /*#__PURE__*/Object.freeze({ - bilibiliDanmuParseFromXml: bilibiliDanmuParseFromXml, - bilibiliDanmuParseFromUrl: bilibiliDanmuParseFromUrl, - bilibiliDanmuParseFromAv: bilibiliDanmuParseFromAv - }); - function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { @@ -163,6 +68,204 @@ var createClass = _createClass; + var i18n = { + 'zh-cn': { + 'Danmu opacity': '弹幕透明度', + 'Danmu speed': '弹幕速度', + 'Danmu size': '弹幕大小', + 'Danmu text cannot be empty': '弹幕文本不能为空', + 'The length of the danmu does not exceed': '弹幕文本字数不能超过' + }, + 'zh-tw': { + 'Danmu opacity': '彈幕透明度', + 'Danmu speed': '彈幕速度', + 'Danmu size': '弹幕大小', + 'Danmu text cannot be empty': '彈幕文本不能為空', + 'The length of the danmu does not exceed': '彈幕文本字數不能超過' + } + }; + + function opacity(art) { + var i18n = art.i18n, + proxy = art.events.proxy; + return { + name: 'danmuku-opacity', + index: 30, + html: "\n
\n ".concat(i18n.get('Danmu opacity'), ": 100%\n
\n
\n \n
\n "), + mounted: function mounted($setting) { + var $range = $setting.querySelector('input[type=range]'); + var $value = $setting.querySelector('.art-value'); + proxy($range, 'change', function () { + var value = $range.value; + $value.innerText = Number(value) * 100; + art.plugins.artplayerPluginDanmuku.config({ + opacity: Number(value) + }); + art.on('artplayerPluginDanmuku:config', function (config) { + if ($range.value !== config.opacity) { + $range.value = config.opacity; + $value.innerText = config.opacity * 100; + } + }); + }); + } + }; + } + function size(art) { + var i18n = art.i18n, + proxy = art.events.proxy; + return { + name: 'danmuku-size', + index: 50, + html: "\n
\n ".concat(i18n.get('Danmu size'), ": 25px\n
\n
\n \n
\n "), + mounted: function mounted($setting) { + var $range = $setting.querySelector('input[type=range]'); + var $value = $setting.querySelector('.art-value'); + proxy($range, 'change', function () { + var value = $range.value; + $value.innerText = value; + art.plugins.artplayerPluginDanmuku.config({ + fontSize: Number(value) + }); + art.on('artplayerPluginDanmuku:config', function (config) { + if ($range.value !== config.fontSize) { + $range.value = config.fontSize; + $value.innerText = config.fontSize; + } + }); + }); + } + }; + } + function speed(art) { + var i18n = art.i18n, + proxy = art.events.proxy; + return { + name: 'danmuku-speed', + index: 40, + html: "\n
\n ".concat(i18n.get('Danmu speed'), ": 5s\n
\n
\n \n
\n "), + mounted: function mounted($setting) { + var $range = $setting.querySelector('input[type=range]'); + var $value = $setting.querySelector('.art-value'); + proxy($range, 'change', function () { + var value = $range.value; + $value.innerText = value; + art.plugins.artplayerPluginDanmuku.config({ + speed: Number(value) + }); + art.on('artplayerPluginDanmuku:config', function (config) { + if ($range.value !== config.speed) { + $range.value = config.speed; + $value.innerText = config.speed; + } + }); + }); + } + }; + } + + function filter(queue, state, callback) { + return queue.filter(function (danmu) { + return danmu.$state === state; + }).map(callback); + } + function getRect(ref, key) { + var result = ref.getBoundingClientRect(); + return key ? result[key] : result; + } + + function _arrayWithHoles(arr) { + if (Array.isArray(arr)) return arr; + } + + var arrayWithHoles = _arrayWithHoles; + + function _iterableToArrayLimit(arr, i) { + var _arr = []; + var _n = true; + var _d = false; + var _e = undefined; + + try { + for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + + if (i && _arr.length === i) break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) _i["return"](); + } finally { + if (_d) throw _e; + } + } + + return _arr; + } + + var iterableToArrayLimit = _iterableToArrayLimit; + + function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance"); + } + + var nonIterableRest = _nonIterableRest; + + function _slicedToArray(arr, i) { + return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest(); + } + + var slicedToArray = _slicedToArray; + + function getMode(key) { + switch (key) { + case 1: + case 2: + case 3: + return 'scroll'; + + case 4: + case 5: + return 'static'; + + default: + return null; + } + } + function bilibiliDanmuParseFromXml(xmlString) { + if (typeof xmlString !== 'string') return []; + var srtList = xmlString.match(/[\S ]*?)<\/d>/gi); + return srtList.length ? srtList.map(function (item) { + var _item$match = item.match(/(.+)<\/d>/), + _item$match2 = slicedToArray(_item$match, 3), + attrStr = _item$match2[1], + text = _item$match2[2]; + + var attr = attrStr.split(','); + return attr.length === 8 && text.trim() ? { + text: text, + time: Number(attr[0]), + mode: getMode(Number(attr[1])), + fontSize: Number(attr[2]), + color: "#".concat(Number(attr[3]).toString(16)), + timestamp: Number(attr[4]), + pool: Number(attr[5]), + userID: attr[6], + rowID: Number(attr[7]) + } : null; + }) : []; + } + function bilibiliDanmuParseFromUrl(url) { + return fetch(url).then(function (res) { + return res.text(); + }).then(function (xmlString) { + return bilibiliDanmuParseFromXml(xmlString); + }); + } + function getDanmuTopByDiff(danmus) { var top = 0; var maxDiff = 0; @@ -247,6 +350,10 @@ classCallCheck(this, Danmuku); + art.i18n.update(i18n); + art.setting.add(opacity); + art.setting.add(size); + art.setting.add(speed); this.art = art; this.queue = []; this.refs = []; @@ -255,26 +362,24 @@ this.isStop = false; this.animationFrameTimer = null; this.$danmuku = art.template.$danmuku; - art.i18n.update(Danmuku.i18n); art.on('video:play', this.start.bind(this)); art.on('video:playing', this.start.bind(this)); art.on('video:pause', this.stop.bind(this)); art.on('video:waiting', this.stop.bind(this)); - art.on('resize', this.resize.bind(this)); art.on('destroy', this.stop.bind(this)); if (typeof this.option.danmuku === 'function') { this.option.danmuku().then(function (danmus) { - danmus.forEach(_this.addToQueue.bind(_this)); + danmus.forEach(_this.emit.bind(_this)); art.emit('artplayerPluginDanmuku:loaded'); }); } else if (typeof this.option.danmuku === 'string') { bilibiliDanmuParseFromUrl(this.option.danmuku).then(function (danmus) { - danmus.forEach(_this.addToQueue.bind(_this)); + danmus.forEach(_this.emit.bind(_this)); art.emit('artplayerPluginDanmuku:loaded'); }); } else { - this.option.danmuku.forEach(this.addToQueue.bind(this)); + this.option.danmuku.forEach(this.emit.bind(this)); art.emit('artplayerPluginDanmuku:loaded'); } } @@ -296,94 +401,51 @@ this.art.emit('artplayerPluginDanmuku:config', this.option); } }, { - key: "emit", - value: function emit(danmu) { - var $player = this.art.template.$player; - danmu.$ref = this.getDanmuRef(); - danmu.$ref.style.opacity = this.option.opacity; - danmu.$ref.style.fontSize = "".concat(this.option.fontSize, "px"); - danmu.$ref.innerText = danmu.text; - danmu.$ref.style.color = danmu.color; - var playerWidth = Danmuku.getRect($player, 'width'); - var danmuWidth = Danmuku.getRect(danmu.$ref, 'width'); - danmu.$restWidth = playerWidth + danmuWidth + 5; - danmu.$restTime = this.option.speed; - danmu.$lastStartTime = Date.now(); - danmu.$ref.style.left = "".concat(playerWidth, "px"); - danmu.$ref.style.top = "".concat(this.getDanmuTop(), "px"); - danmu.$ref.style.transform = "translateX(".concat(-danmu.$restWidth, "px) translateY(0px) translateZ(0px)"); - danmu.$ref.style.transition = "transform ".concat(danmu.$restTime, "s linear 0s"); + key: "continue", + value: function _continue() { + filter(this.queue, 'stop', function (danmu) { + danmu.$state = 'emit'; + danmu.$lastStartTime = Date.now(); - if (danmu.border) { - danmu.$ref.style.border = "1px solid ".concat(danmu.border); - } + switch (danmu.mode) { + case 'scroll': + danmu.$ref.style.transform = "translateX(".concat(-danmu.$restWidth, "px) translateY(0px) translateZ(0px)"); + danmu.$ref.style.transition = "transform ".concat(danmu.$restTime, "s linear 0s"); + break; - danmu.$state = 'emit'; - } - }, { - key: "resize", - value: function resize() { - var $player = this.art.template.$player; - - var _Danmuku$getRect = Danmuku.getRect($player), - playerWidth = _Danmuku$getRect.width; - - this.queue.forEach(function (danmu) { - danmu.$state = 'wait'; - }); - this.refs.forEach(function ($ref) { - $ref.style.left = "".concat(playerWidth, "px"); - $ref.style.border = 'none'; - $ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)'; - $ref.style.transition = 'transform 0s linear 0s'; + default: + break; + } }); } }, { key: "suspend", - value: function suspend(danmu) { + value: function suspend() { var $player = this.art.template.$player; - var _Danmuku$getRect2 = Danmuku.getRect($player), - playerLeft = _Danmuku$getRect2.left, - playerWidth = _Danmuku$getRect2.width; + var _getRect = getRect($player), + playerLeft = _getRect.left, + playerWidth = _getRect.width; - var _Danmuku$getRect3 = Danmuku.getRect(danmu.$ref), - danmuLeft = _Danmuku$getRect3.left; + filter(this.queue, 'emit', function (danmu) { + danmu.$state = 'stop'; - danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000; - var translateX = playerWidth - (danmuLeft - playerLeft) + 5; - danmu.$ref.style.transform = "translateX(".concat(-translateX, "px) translateY(0px) translateZ(0px)"); - danmu.$ref.style.transition = 'transform 0s linear 0s'; - danmu.$state = 'stop'; - } - }, { - key: "addToQueue", - value: function addToQueue(danmu) { - var _this$art = this.art, - notice = _this$art.notice, - player = _this$art.player, - i18n = _this$art.i18n; + var _getRect2 = getRect(danmu.$ref), + danmuLeft = _getRect2.left; - if (!danmu.text.trim()) { - notice.show(i18n.get('Danmu text cannot be empty')); - return; - } + danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000; + var translateX = playerWidth - (danmuLeft - playerLeft) + 5; - if (danmu.text.length > this.option.maxlength) { - notice.show("".concat(i18n.get('The length of the danmu does not exceed'), " ").concat(this.option.maxlength)); - return; - } + switch (danmu.mode) { + case 'scroll': + danmu.$ref.style.transform = "translateX(".concat(-translateX, "px) translateY(0px) translateZ(0px)"); + danmu.$ref.style.transition = 'transform 0s linear 0s'; + break; - if (typeof danmu.time !== 'number') { - danmu.time = player.currentTime; - } - - this.queue.push(objectSpread({}, danmu, { - $state: 'wait', - $ref: null, - $restTime: 0, - $lastStartTime: 0 - })); + default: + break; + } + }); } }, { key: "getDanmuRef", @@ -392,20 +454,20 @@ var _this$art$constructor2 = this.art.constructor.utils, setStyles = _this$art$constructor2.setStyles, append = _this$art$constructor2.append; - var playerLeft = Danmuku.getRect($player, 'left'); + var playerLeft = getRect($player, 'left'); var waitDanmu = this.queue.find(function (danmu) { if (danmu.$ref) { - var _Danmuku$getRect4 = Danmuku.getRect(danmu.$ref), - danmuLeft = _Danmuku$getRect4.left, - danmuWidth = _Danmuku$getRect4.width; + var _getRect3 = getRect(danmu.$ref), + danmuLeft = _getRect3.left, + danmuWidth = _getRect3.width; - return danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth; + return danmu.$state === 'wait' || danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth; } return false; }); - if (waitDanmu) { + if (waitDanmu && waitDanmu.$state === 'emit') { waitDanmu.$state = 'wait'; waitDanmu.$ref.style.border = 'none'; waitDanmu.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)'; @@ -437,11 +499,11 @@ value: function getDanmuTop$1() { var $player = this.art.template.$player; - var _Danmuku$getRect5 = Danmuku.getRect($player), - playerLeft = _Danmuku$getRect5.left, - playerTop = _Danmuku$getRect5.top, - playerHeight = _Danmuku$getRect5.height, - playerWidth = _Danmuku$getRect5.width; + var _getRect4 = getRect($player), + playerLeft = _getRect4.left, + playerTop = _getRect4.top, + playerHeight = _getRect4.height, + playerWidth = _getRect4.width; var danmus = this.queue.filter(function (danmu) { return danmu.$state === 'emit'; @@ -452,11 +514,11 @@ } var danmusBySort = danmus.map(function (danmu) { - var _Danmuku$getRect6 = Danmuku.getRect(danmu.$ref), - danmuLeft = _Danmuku$getRect6.left, - danmuTop = _Danmuku$getRect6.top, - danmuWidth = _Danmuku$getRect6.width, - danmuHeight = _Danmuku$getRect6.height; + var _getRect5 = getRect(danmu.$ref), + danmuLeft = _getRect5.left, + danmuTop = _getRect5.top, + danmuWidth = _getRect5.width, + danmuHeight = _getRect5.height; var top = danmuTop - playerTop; var left = danmuLeft - playerLeft; @@ -492,13 +554,48 @@ value: function update() { var _this2 = this; - var player = this.art.player; + var _this$art = this.art, + player = _this$art.player, + $player = _this$art.template.$player; this.animationFrameTimer = window.requestAnimationFrame(function () { if (player.playing) { _this2.queue.filter(function (danmu) { return player.currentTime + 0.1 >= danmu.time && danmu.time >= player.currentTime - 0.1 && danmu.$state === 'wait'; }).forEach(function (danmu) { - _this2.emit(danmu); + danmu.$state = 'emit'; + danmu.$ref = _this2.getDanmuRef(); + danmu.$ref.style.opacity = _this2.option.opacity; + danmu.$ref.style.fontSize = "".concat(_this2.option.fontSize, "px"); + danmu.$ref.innerText = danmu.text; + danmu.$ref.style.color = danmu.color; + danmu.$ref.style.border = danmu.border ? "1px solid ".concat(danmu.color) : 'none'; + danmu.$restTime = _this2.option.speed; + danmu.$lastStartTime = Date.now(); + var danmuWidth = getRect(danmu.$ref, 'width'); + + var danmuTop = _this2.getDanmuTop(danmu.mode); + + switch (danmu.mode) { + case 'scroll': + { + var danmuLeft = getRect($player, 'width'); + danmu.$restWidth = danmuLeft + danmuWidth + 5; + danmu.$ref.style.left = "".concat(danmuLeft, "px"); + danmu.$ref.style.top = "".concat(danmuTop, "px"); + danmu.$ref.style.transform = "translateX(".concat(-danmu.$restWidth, "px) translateY(0px) translateZ(0px)"); + danmu.$ref.style.transition = "transform ".concat(danmu.$restTime, "s linear 0s"); + break; + } + + case 'static': + danmu.$ref.style.top = "".concat(danmuTop, "px"); + danmu.$ref.style.left = '50%'; + danmu.$ref.style.marginLeft = "-".concat(danmuWidth / 2, "px"); + break; + + default: + break; + } }); } @@ -510,14 +607,8 @@ }, { key: "stop", value: function stop() { - var _this3 = this; - this.isStop = true; - this.queue.filter(function (danmu) { - return danmu.$state === 'emit'; - }).forEach(function (danmu) { - _this3.suspend(danmu); - }); + this.suspend(); window.cancelAnimationFrame(this.animationFrameTimer); this.art.emit('artplayerPluginDanmuku:stop'); } @@ -525,11 +616,7 @@ key: "start", value: function start() { this.isStop = false; - this.queue.filter(function (danmu) { - return danmu.$state === 'stop'; - }).forEach(function (danmu) { - Danmuku["continue"](danmu); - }); + this["continue"](); this.update(); this.art.emit('artplayerPluginDanmuku:start'); } @@ -545,35 +632,37 @@ this.$danmuku.style = 'none'; this.art.emit('artplayerPluginDanmuku:hide'); } + }, { + key: "emit", + value: function emit(danmu) { + var _this$art2 = this.art, + notice = _this$art2.notice, + player = _this$art2.player, + i18n = _this$art2.i18n; + + if (!danmu.text.trim()) { + notice.show(i18n.get('Danmu text cannot be empty')); + return; + } + + if (danmu.text.length > this.option.maxlength) { + notice.show("".concat(i18n.get('The length of the danmu does not exceed'), " ").concat(this.option.maxlength)); + return; + } + + if (typeof danmu.time !== 'number') { + danmu.time = player.currentTime; + } + + this.queue.push(objectSpread({}, danmu, { + $state: 'wait', + $ref: null, + $restTime: 0, + $lastStartTime: 0, + $restWidth: 0 + })); + } }], [{ - key: "getRect", - value: function getRect(ref, key) { - var result = ref.getBoundingClientRect(); - return key ? result[key] : result; - } - }, { - key: "continue", - value: function _continue(danmu) { - danmu.$lastStartTime = Date.now(); - danmu.$ref.style.transform = "translateX(".concat(-danmu.$restWidth, "px) translateY(0px) translateZ(0px)"); - danmu.$ref.style.transition = "transform ".concat(danmu.$restTime, "s linear 0s"); - danmu.$state = 'emit'; - } - }, { - key: "i18n", - get: function get() { - return { - 'zh-cn': { - 'Danmu text cannot be empty': '弹幕文本不能为空', - 'The length of the danmu does not exceed': '弹幕文本字数不能超过' - }, - 'zh-tw': { - 'Danmu text cannot be empty': '彈幕文本不能為空', - 'The length of the danmu does not exceed': '彈幕文本字數不能超過' - } - }; - } - }, { key: "option", get: function get() { return { @@ -602,110 +691,12 @@ return Danmuku; }(); - var i18n = { - 'zh-cn': { - 'Danmu opacity': '弹幕透明度', - 'Danmu speed': '弹幕速度', - 'Danmu size': '弹幕大小' - }, - 'zh-tw': { - 'Danmu opacity': '彈幕透明度', - 'Danmu speed': '彈幕速度', - 'Danmu size': '弹幕大小' - } - }; - - function setting(art) { - var i18n = art.i18n, - proxy = art.events.proxy; - return { - name: 'danmuku-opacity', - index: 30, - html: "\n
\n ".concat(i18n.get('Danmu opacity'), ": 100%\n
\n
\n \n
\n "), - mounted: function mounted($setting) { - var $range = $setting.querySelector('input[type=range]'); - var $value = $setting.querySelector('.art-value'); - proxy($range, 'change', function () { - var value = $range.value; - $value.innerText = Number(value) * 100; - art.plugins.artplayerPluginDanmuku.config({ - opacity: Number(value) - }); - art.on('artplayerPluginDanmuku:config', function (config) { - if ($range.value !== config.opacity) { - $range.value = config.opacity; - $value.innerText = config.opacity * 100; - } - }); - }); - } - }; - } - - function setting$1(art) { - var i18n = art.i18n, - proxy = art.events.proxy; - return { - name: 'danmuku-speed', - index: 40, - html: "\n
\n ".concat(i18n.get('Danmu speed'), ": 5s\n
\n
\n \n
\n "), - mounted: function mounted($setting) { - var $range = $setting.querySelector('input[type=range]'); - var $value = $setting.querySelector('.art-value'); - proxy($range, 'change', function () { - var value = $range.value; - $value.innerText = value; - art.plugins.artplayerPluginDanmuku.config({ - speed: Number(value) - }); - art.on('artplayerPluginDanmuku:config', function (config) { - if ($range.value !== config.speed) { - $range.value = config.speed; - $value.innerText = config.speed; - } - }); - }); - } - }; - } - - function setting$2(art) { - var i18n = art.i18n, - proxy = art.events.proxy; - return { - name: 'danmuku-size', - index: 50, - html: "\n
\n ".concat(i18n.get('Danmu size'), ": 25px\n
\n
\n \n
\n "), - mounted: function mounted($setting) { - var $range = $setting.querySelector('input[type=range]'); - var $value = $setting.querySelector('.art-value'); - proxy($range, 'change', function () { - var value = $range.value; - $value.innerText = value; - art.plugins.artplayerPluginDanmuku.config({ - fontSize: Number(value) - }); - art.on('artplayerPluginDanmuku:config', function (config) { - if ($range.value !== config.fontSize) { - $range.value = config.fontSize; - $value.innerText = config.fontSize; - } - }); - }); - } - }; - } - function artplayerPluginDanmuku(option) { return function (art) { var danmuku = new Danmuku(art, option); - art.i18n.update(i18n); - art.setting.add(setting); - art.setting.add(setting$1); - art.setting.add(setting$2); return { name: 'artplayerPluginDanmuku', - emit: danmuku.addToQueue.bind(danmuku), + emit: danmuku.emit.bind(danmuku), config: danmuku.config.bind(danmuku), start: danmuku.start.bind(danmuku), stop: danmuku.stop.bind(danmuku), @@ -715,8 +706,6 @@ }; } - artplayerPluginDanmuku.bilibili = bilibili; - return artplayerPluginDanmuku; })); diff --git a/docs/uncompiled/artplayer-plugin-danmuku.js.map b/docs/uncompiled/artplayer-plugin-danmuku.js.map index 1c1da96ed..79f9e90a3 100644 --- a/docs/uncompiled/artplayer-plugin-danmuku.js.map +++ b/docs/uncompiled/artplayer-plugin-danmuku.js.map @@ -1 +1 @@ -{"version":3,"file":"artplayer-plugin-danmuku.js","sources":["../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer-plugin-danmuku/src/bilibiliDanmuParse.js","../../node_modules/@babel/runtime/helpers/defineProperty.js","../../node_modules/@babel/runtime/helpers/objectSpread.js","../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../packages/artplayer-plugin-danmuku/src/getDanmuTop.js","../../packages/artplayer-plugin-danmuku/src/danmuku.js","../../packages/artplayer-plugin-danmuku/src/i18n.js","../../packages/artplayer-plugin-danmuku/src/settingOpacity.js","../../packages/artplayer-plugin-danmuku/src/settingSpeed.js","../../packages/artplayer-plugin-danmuku/src/settingSize.js","../../packages/artplayer-plugin-danmuku/src/index.js"],"sourcesContent":["function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const srtList = xmlString.match(/[\\S ]*?)<\\/d>/gi);\n return srtList.length\n ? srtList.map(item => {\n const [, attrStr, text] = item.match(/(.+)<\\/d>/);\n const attr = attrStr.split(',');\n return attr.length === 8 && text.trim()\n ? {\n text,\n time: Number(attr[0]),\n mode: Number(attr[1]),\n fontSize: Number(attr[2]),\n color: `#${Number(attr[3]).toString(16)}`,\n timestamp: Number(attr[4]),\n pool: Number(attr[5]),\n userID: attr[6],\n rowID: Number(attr[7]),\n }\n : null;\n })\n : [];\n}\n\nexport function bilibiliDanmuParseFromUrl(url) {\n return fetch(url)\n .then(res => res.text())\n .then(xmlString => {\n return bilibiliDanmuParseFromXml(xmlString);\n });\n}\n\nexport function bilibiliDanmuParseFromAv(av) {\n const corsUrl = 'https://cors-anywhere.herokuapp.com/';\n return fetch(`${corsUrl}https://api.bilibili.com/x/web-interface/view?aid=${av}`)\n .then(res => res.json())\n .then(res => {\n if (res.code === 0 && res.data && res.data.cid) {\n return bilibiliDanmuParseFromUrl(`${corsUrl}https://api.bilibili.com/x/v1/dm/list.so?oid=${res.data.cid}`);\n }\n throw new Error(`Unable to get data: ${JSON.stringify(res)}`);\n });\n}","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","var defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nmodule.exports = _objectSpread;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","function getDanmuTopByDiff(danmus) {\n let top = 0;\n let maxDiff = 0;\n for (let index = 1; index < danmus.length; index += 1) {\n const item = danmus[index];\n const prev = danmus[index - 1];\n const prevTop = prev.top + prev.height;\n const diff = item.top - prevTop;\n if (diff > maxDiff) {\n top = prevTop;\n maxDiff = diff;\n }\n }\n return top;\n}\n\nfunction getDanmuTopBySparse(danmus) {\n const topMap = {};\n for (let index = 0; index < danmus.length; index += 1) {\n const item = danmus[index];\n if (topMap[item.top]) {\n topMap[item.top].push(item);\n } else {\n topMap[item.top] = [item];\n }\n }\n\n let maxRight = 0;\n let top = 0;\n const topMapKeys = Object.keys(topMap);\n for (let index = 0; index < topMapKeys.length; index += 1) {\n let minRight = danmus[0].width;\n const topKey = topMapKeys[index];\n const danmuArr = topMap[topKey];\n for (let index = 0; index < danmuArr.length; index += 1) {\n const danmu = danmuArr[index];\n if (danmu.right < minRight) {\n minRight = danmu.right;\n }\n }\n\n if (minRight > maxRight) {\n maxRight = minRight;\n [{ top }] = danmuArr;\n }\n }\n\n if (top === 0) {\n const randomKey = Math.floor(Math.random() * (2 - topMapKeys.length) + topMapKeys.length - 1);\n top = topMapKeys[randomKey];\n }\n\n return top;\n}\n\nexport default function getDanmuTop(danmus) {\n let top = getDanmuTopByDiff(danmus);\n if (top === 0) {\n top = getDanmuTopBySparse(danmus);\n }\n return top;\n}\n","import { bilibiliDanmuParseFromUrl } from './bilibiliDanmuParse';\nimport getDanmuTop from './getDanmuTop';\n\nexport default class Danmuku {\n constructor(art, option) {\n this.art = art;\n this.queue = [];\n this.refs = [];\n this.option = {};\n this.config(option);\n this.isStop = false;\n this.animationFrameTimer = null;\n this.$danmuku = art.template.$danmuku;\n art.i18n.update(Danmuku.i18n);\n art.on('video:play', this.start.bind(this));\n art.on('video:playing', this.start.bind(this));\n art.on('video:pause', this.stop.bind(this));\n art.on('video:waiting', this.stop.bind(this));\n art.on('resize', this.resize.bind(this));\n art.on('destroy', this.stop.bind(this));\n if (typeof this.option.danmuku === 'function') {\n this.option.danmuku().then(danmus => {\n danmus.forEach(this.addToQueue.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n });\n } else if (typeof this.option.danmuku === 'string') {\n bilibiliDanmuParseFromUrl(this.option.danmuku).then(danmus => {\n danmus.forEach(this.addToQueue.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n });\n } else {\n this.option.danmuku.forEach(this.addToQueue.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n }\n }\n\n static get i18n() {\n return {\n 'zh-cn': {\n 'Danmu text cannot be empty': '弹幕文本不能为空',\n 'The length of the danmu does not exceed': '弹幕文本字数不能超过',\n },\n 'zh-tw': {\n 'Danmu text cannot be empty': '彈幕文本不能為空',\n 'The length of the danmu does not exceed': '彈幕文本字數不能超過',\n },\n };\n }\n\n static get option() {\n return {\n danmuku: [],\n speed: 5,\n maxlength: 50,\n margin: [10, 100],\n opacity: 1,\n fontSize: 25,\n };\n }\n\n static get scheme() {\n return {\n danmuku: 'array|function|string',\n speed: 'number',\n maxlength: 'number',\n margin: 'array',\n opacity: 'number',\n fontSize: 'number',\n };\n }\n\n static getRect(ref, key) {\n const result = ref.getBoundingClientRect();\n return key ? result[key] : result;\n }\n\n config(option) {\n const {\n utils: { clamp },\n validator,\n } = this.art.constructor;\n this.option = Object.assign({}, Danmuku.option, this.option, option);\n validator(this.option, Danmuku.scheme);\n this.option.speed = clamp(this.option.speed, 1, 10);\n this.option.maxlength = clamp(this.option.maxlength, 10, 100);\n this.option.margin[0] = clamp(this.option.margin[0], 0, 100);\n this.option.margin[1] = clamp(this.option.margin[1], 0, 100);\n this.option.opacity = clamp(this.option.opacity, 0, 1);\n this.option.fontSize = clamp(this.option.fontSize, 12, 30);\n this.art.emit('artplayerPluginDanmuku:config', this.option);\n }\n\n emit(danmu) {\n const { $player } = this.art.template;\n danmu.$ref = this.getDanmuRef();\n danmu.$ref.style.opacity = this.option.opacity;\n danmu.$ref.style.fontSize = `${this.option.fontSize}px`;\n danmu.$ref.innerText = danmu.text;\n danmu.$ref.style.color = danmu.color;\n const playerWidth = Danmuku.getRect($player, 'width');\n const danmuWidth = Danmuku.getRect(danmu.$ref, 'width');\n danmu.$restWidth = playerWidth + danmuWidth + 5;\n danmu.$restTime = this.option.speed;\n danmu.$lastStartTime = Date.now();\n danmu.$ref.style.left = `${playerWidth}px`;\n danmu.$ref.style.top = `${this.getDanmuTop()}px`;\n danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n if (danmu.border) {\n danmu.$ref.style.border = `1px solid ${danmu.border}`;\n }\n danmu.$state = 'emit';\n }\n\n static continue(danmu) {\n danmu.$lastStartTime = Date.now();\n danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n danmu.$state = 'emit';\n }\n\n resize() {\n const { $player } = this.art.template;\n const { width: playerWidth } = Danmuku.getRect($player);\n this.queue.forEach(danmu => {\n danmu.$state = 'wait';\n });\n this.refs.forEach($ref => {\n $ref.style.left = `${playerWidth}px`;\n $ref.style.border = 'none';\n $ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)';\n $ref.style.transition = 'transform 0s linear 0s';\n });\n }\n\n suspend(danmu) {\n const { $player } = this.art.template;\n const { left: playerLeft, width: playerWidth } = Danmuku.getRect($player);\n const { left: danmuLeft } = Danmuku.getRect(danmu.$ref);\n danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000;\n const translateX = playerWidth - (danmuLeft - playerLeft) + 5;\n danmu.$ref.style.transform = `translateX(${-translateX}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = 'transform 0s linear 0s';\n danmu.$state = 'stop';\n }\n\n addToQueue(danmu) {\n const { notice, player, i18n } = this.art;\n if (!danmu.text.trim()) {\n notice.show(i18n.get('Danmu text cannot be empty'));\n return;\n }\n\n if (danmu.text.length > this.option.maxlength) {\n notice.show(`${i18n.get('The length of the danmu does not exceed')} ${this.option.maxlength}`);\n return;\n }\n\n if (typeof danmu.time !== 'number') {\n danmu.time = player.currentTime;\n }\n\n this.queue.push({\n ...danmu,\n $state: 'wait',\n $ref: null,\n $restTime: 0,\n $lastStartTime: 0,\n });\n }\n\n getDanmuRef() {\n const { $player } = this.art.template;\n const { setStyles, append } = this.art.constructor.utils;\n const playerLeft = Danmuku.getRect($player, 'left');\n\n const waitDanmu = this.queue.find(danmu => {\n if (danmu.$ref) {\n const { left: danmuLeft, width: danmuWidth } = Danmuku.getRect(danmu.$ref);\n return danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth;\n }\n return false;\n });\n\n if (waitDanmu) {\n waitDanmu.$state = 'wait';\n waitDanmu.$ref.style.border = 'none';\n waitDanmu.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)';\n waitDanmu.$ref.style.transition = 'transform 0s linear 0s';\n this.$danmuku.appendChild(waitDanmu.$ref);\n return waitDanmu.$ref;\n }\n\n const $ref = document.createElement('div');\n\n setStyles($ref, {\n userSelect: 'none',\n position: 'absolute',\n whiteSpace: 'pre',\n pointerEvents: 'none',\n perspective: '500px',\n display: 'inline-block',\n willChange: 'transform',\n fontFamily: 'SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif',\n fontWeight: 'normal',\n lineHeight: '1.125',\n textShadow:\n 'rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px',\n });\n\n append(this.$danmuku, $ref);\n this.refs.push($ref);\n return $ref;\n }\n\n getDanmuTop() {\n const { $player } = this.art.template;\n const { left: playerLeft, top: playerTop, height: playerHeight, width: playerWidth } = Danmuku.getRect($player);\n const danmus = this.queue.filter(danmu => danmu.$state === 'emit');\n\n if (danmus.length === 0) {\n return this.option.margin[0];\n }\n\n const danmusBySort = danmus\n .map(danmu => {\n const { left: danmuLeft, top: danmuTop, width: danmuWidth, height: danmuHeight } = Danmuku.getRect(\n danmu.$ref,\n );\n const top = danmuTop - playerTop;\n const left = danmuLeft - playerLeft;\n const right = playerWidth - left - danmuWidth;\n return {\n top,\n left,\n right,\n height: danmuHeight,\n width: danmuWidth,\n };\n })\n .sort((prev, next) => {\n return prev.top - next.top;\n });\n\n danmusBySort.unshift({\n top: 0,\n left: 0,\n right: 0,\n height: this.option.margin[0],\n width: playerWidth,\n });\n\n danmusBySort.push({\n top: playerHeight - this.option.margin[1],\n left: 0,\n right: 0,\n height: this.option.margin[1],\n width: playerWidth,\n });\n\n return getDanmuTop(danmusBySort);\n }\n\n update() {\n const { player } = this.art;\n this.animationFrameTimer = window.requestAnimationFrame(() => {\n if (player.playing) {\n this.queue\n .filter(danmu => {\n return (\n player.currentTime + 0.1 >= danmu.time &&\n danmu.time >= player.currentTime - 0.1 &&\n danmu.$state === 'wait'\n );\n })\n .forEach(danmu => {\n this.emit(danmu);\n });\n }\n\n if (!this.isStop) {\n this.update();\n }\n });\n }\n\n stop() {\n this.isStop = true;\n this.queue\n .filter(danmu => danmu.$state === 'emit')\n .forEach(danmu => {\n this.suspend(danmu);\n });\n window.cancelAnimationFrame(this.animationFrameTimer);\n this.art.emit('artplayerPluginDanmuku:stop');\n }\n\n start() {\n this.isStop = false;\n this.queue\n .filter(danmu => danmu.$state === 'stop')\n .forEach(danmu => {\n Danmuku.continue(danmu);\n });\n this.update();\n this.art.emit('artplayerPluginDanmuku:start');\n }\n\n show() {\n this.$danmuku.style = 'block';\n this.art.emit('artplayerPluginDanmuku:show');\n }\n\n hide() {\n this.$danmuku.style = 'none';\n this.art.emit('artplayerPluginDanmuku:hide');\n }\n}\n","export default {\n 'zh-cn': {\n 'Danmu opacity': '弹幕透明度',\n 'Danmu speed': '弹幕速度',\n 'Danmu size': '弹幕大小',\n },\n 'zh-tw': {\n 'Danmu opacity': '彈幕透明度',\n 'Danmu speed': '彈幕速度',\n 'Danmu size': '弹幕大小',\n },\n};","export default function setting(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-opacity',\n index: 30,\n html: `\n
\n ${i18n.get('Danmu opacity')}: 100%\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = Number(value) * 100;\n\n art.plugins.artplayerPluginDanmuku.config({\n opacity: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.opacity) {\n $range.value = config.opacity;\n $value.innerText = config.opacity * 100;\n }\n });\n });\n },\n };\n}\n","export default function setting(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-speed',\n index: 40,\n html: `\n
\n ${i18n.get('Danmu speed')}: 5s\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = value;\n\n art.plugins.artplayerPluginDanmuku.config({\n speed: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.speed) {\n $range.value = config.speed;\n $value.innerText = config.speed;\n }\n });\n });\n },\n };\n}\n","export default function setting(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-size',\n index: 50,\n html: `\n
\n ${i18n.get('Danmu size')}: 25px\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = value;\n\n art.plugins.artplayerPluginDanmuku.config({\n fontSize: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.fontSize) {\n $range.value = config.fontSize;\n $value.innerText = config.fontSize;\n }\n });\n });\n },\n };\n}\n","import * as bilibili from './bilibiliDanmuParse';\nimport Danmuku from './danmuku';\nimport i18n from './i18n';\nimport settingOpacity from './settingOpacity';\nimport settingSpeed from './settingSpeed';\nimport settingSize from './settingSize';\n\nfunction artplayerPluginDanmuku(option) {\n return art => {\n const danmuku = new Danmuku(art, option);\n art.i18n.update(i18n);\n art.setting.add(settingOpacity);\n art.setting.add(settingSpeed);\n art.setting.add(settingSize);\n return {\n name: 'artplayerPluginDanmuku',\n emit: danmuku.addToQueue.bind(danmuku),\n config: danmuku.config.bind(danmuku),\n start: danmuku.start.bind(danmuku),\n stop: danmuku.stop.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n };\n };\n}\n\nartplayerPluginDanmuku.bilibili = bilibili;\nexport default artplayerPluginDanmuku;\n"],"names":["bilibiliDanmuParseFromXml","xmlString","srtList","match","length","map","item","attrStr","text","attr","split","trim","time","Number","mode","fontSize","color","toString","timestamp","pool","userID","rowID","bilibiliDanmuParseFromUrl","url","fetch","then","res","bilibiliDanmuParseFromAv","av","corsUrl","json","code","data","cid","Error","JSON","stringify","getDanmuTopByDiff","danmus","top","maxDiff","index","prev","prevTop","height","diff","getDanmuTopBySparse","topMap","push","maxRight","topMapKeys","Object","keys","minRight","width","topKey","danmuArr","danmu","right","randomKey","Math","floor","random","getDanmuTop","Danmuku","art","option","queue","refs","config","isStop","animationFrameTimer","$danmuku","template","i18n","update","on","start","bind","stop","resize","danmuku","forEach","addToQueue","emit","constructor","clamp","utils","validator","assign","scheme","speed","maxlength","margin","opacity","$player","$ref","getDanmuRef","style","innerText","playerWidth","getRect","danmuWidth","$restWidth","$restTime","$lastStartTime","Date","now","left","transform","transition","border","$state","playerLeft","danmuLeft","translateX","notice","player","show","get","currentTime","setStyles","append","waitDanmu","find","appendChild","document","createElement","userSelect","position","whiteSpace","pointerEvents","perspective","display","willChange","fontFamily","fontWeight","lineHeight","textShadow","playerTop","playerHeight","filter","danmusBySort","danmuTop","danmuHeight","sort","next","unshift","window","requestAnimationFrame","playing","suspend","cancelAnimationFrame","ref","key","result","getBoundingClientRect","setting","proxy","events","name","html","mounted","$setting","$range","querySelector","$value","value","plugins","artplayerPluginDanmuku","add","settingOpacity","settingSpeed","settingSize","hide","bilibili"],"mappings":";;;;;;EAAA,SAAS,eAAe,CAAC,GAAG,EAAE;IAC5B,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;GACpC;;EAED,kBAAc,GAAG,eAAe;;ECJhC,SAAS,qBAAqB,CAAC,GAAG,EAAE,CAAC,EAAE;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,EAAE,GAAG,IAAI,CAAC;IACd,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,IAAI,EAAE,GAAG,SAAS,CAAC;;IAEnB,IAAI;MACF,KAAK,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE;QAClF,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;;QAEpB,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM;OACnC;KACF,CAAC,OAAO,GAAG,EAAE;MACZ,EAAE,GAAG,IAAI,CAAC;MACV,EAAE,GAAG,GAAG,CAAC;KACV,SAAS;MACR,IAAI;QACF,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;OACjD,SAAS;QACR,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;OAClB;KACF;;IAED,OAAO,IAAI,CAAC;GACb;;EAED,wBAAc,GAAG,qBAAqB;;EC1BtC,SAAS,gBAAgB,GAAG;IAC1B,MAAM,IAAI,SAAS,CAAC,sDAAsD,CAAC,CAAC;GAC7E;;EAED,mBAAc,GAAG,gBAAgB;;ECEjC,SAAS,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE;IAC9B,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,oBAAoB,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;GACjF;;EAED,iBAAc,GAAG,cAAc;;ECVxB,SAASA,yBAAT,CAAmCC,SAAnC,EAA8C;EACjD,MAAI,OAAOA,SAAP,KAAqB,QAAzB,EAAmC,OAAO,EAAP;EACnC,MAAMC,OAAO,GAAGD,SAAS,CAACE,KAAV,CAAgB,4BAAhB,CAAhB;EACA,SAAOD,OAAO,CAACE,MAAR,GACDF,OAAO,CAACG,GAAR,CAAY,UAAAC,IAAI,EAAI;EAAA,sBACQA,IAAI,CAACH,KAAL,CAAW,uBAAX,CADR;EAAA;EAAA,QACTI,OADS;EAAA,QACAC,IADA;;EAElB,QAAMC,IAAI,GAAGF,OAAO,CAACG,KAAR,CAAc,GAAd,CAAb;EACA,WAAOD,IAAI,CAACL,MAAL,KAAgB,CAAhB,IAAqBI,IAAI,CAACG,IAAL,EAArB,GACD;EACEH,MAAAA,IAAI,EAAJA,IADF;EAEEI,MAAAA,IAAI,EAAEC,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CAFd;EAGEK,MAAAA,IAAI,EAAED,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CAHd;EAIEM,MAAAA,QAAQ,EAAEF,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CAJlB;EAKEO,MAAAA,KAAK,aAAMH,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CAAN,CAAgBQ,QAAhB,CAAyB,EAAzB,CAAN,CALP;EAMEC,MAAAA,SAAS,EAAEL,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CANnB;EAOEU,MAAAA,IAAI,EAAEN,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL,CAPd;EAQEW,MAAAA,MAAM,EAAEX,IAAI,CAAC,CAAD,CARd;EASEY,MAAAA,KAAK,EAAER,MAAM,CAACJ,IAAI,CAAC,CAAD,CAAL;EATf,KADC,GAYD,IAZN;EAaH,GAhBC,CADC,GAkBD,EAlBN;EAmBH;AAED,EAAO,SAASa,yBAAT,CAAmCC,GAAnC,EAAwC;EAC3C,SAAOC,KAAK,CAACD,GAAD,CAAL,CACFE,IADE,CACG,UAAAC,GAAG;EAAA,WAAIA,GAAG,CAAClB,IAAJ,EAAJ;EAAA,GADN,EAEFiB,IAFE,CAEG,UAAAxB,SAAS,EAAI;EACf,WAAOD,yBAAyB,CAACC,SAAD,CAAhC;EACH,GAJE,CAAP;EAKH;AAED,EAAO,SAAS0B,wBAAT,CAAkCC,EAAlC,EAAsC;EACzC,MAAMC,OAAO,GAAG,sCAAhB;EACA,SAAOL,KAAK,WAAIK,OAAJ,+DAAgED,EAAhE,EAAL,CACFH,IADE,CACG,UAAAC,GAAG;EAAA,WAAIA,GAAG,CAACI,IAAJ,EAAJ;EAAA,GADN,EAEFL,IAFE,CAEG,UAAAC,GAAG,EAAI;EACT,QAAIA,GAAG,CAACK,IAAJ,KAAa,CAAb,IAAkBL,GAAG,CAACM,IAAtB,IAA8BN,GAAG,CAACM,IAAJ,CAASC,GAA3C,EAAgD;EAC5C,aAAOX,yBAAyB,WAAIO,OAAJ,0DAA2DH,GAAG,CAACM,IAAJ,CAASC,GAApE,EAAhC;EACH;;EACD,UAAM,IAAIC,KAAJ,+BAAiCC,IAAI,CAACC,SAAL,CAAeV,GAAf,CAAjC,EAAN;EACH,GAPE,CAAP;EAQH;;;;;;;;EC1CD,SAAS,eAAe,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE;IACxC,IAAI,GAAG,IAAI,GAAG,EAAE;MACd,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE;QAC9B,KAAK,EAAE,KAAK;QACZ,UAAU,EAAE,IAAI;QAChB,YAAY,EAAE,IAAI;QAClB,QAAQ,EAAE,IAAI;OACf,CAAC,CAAC;KACJ,MAAM;MACL,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;KAClB;;IAED,OAAO,GAAG,CAAC;GACZ;;EAED,kBAAc,GAAG,eAAe;;ECbhC,SAAS,aAAa,CAAC,MAAM,EAAE;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACzC,IAAI,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;MACtD,IAAI,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;;MAElC,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU,EAAE;QACtD,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE;UAClF,OAAO,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,UAAU,CAAC;SAChE,CAAC,CAAC,CAAC;OACL;;MAED,OAAO,CAAC,OAAO,CAAC,UAAU,GAAG,EAAE;QAC7B,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;OAC1C,CAAC,CAAC;KACJ;;IAED,OAAO,MAAM,CAAC;GACf;;EAED,gBAAc,GAAG,aAAa;;ECrB9B,SAAS,eAAe,CAAC,QAAQ,EAAE,WAAW,EAAE;IAC9C,IAAI,EAAE,QAAQ,YAAY,WAAW,CAAC,EAAE;MACtC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;KAC1D;GACF;;EAED,kBAAc,GAAG,eAAe;;ECNhC,SAAS,iBAAiB,CAAC,MAAM,EAAE,KAAK,EAAE;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;MACrC,IAAI,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;MAC1B,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,UAAU,IAAI,KAAK,CAAC;MACvD,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC;MAC/B,IAAI,OAAO,IAAI,UAAU,EAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC;MACtD,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;KAC3D;GACF;;EAED,SAAS,YAAY,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE;IAC1D,IAAI,UAAU,EAAE,iBAAiB,CAAC,WAAW,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IACrE,IAAI,WAAW,EAAE,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7D,OAAO,WAAW,CAAC;GACpB;;EAED,eAAc,GAAG,YAAY;;EChB7B,SAASW,iBAAT,CAA2BC,MAA3B,EAAmC;EAC/B,MAAIC,GAAG,GAAG,CAAV;EACA,MAAIC,OAAO,GAAG,CAAd;;EACA,OAAK,IAAIC,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGH,MAAM,CAAClC,MAAnC,EAA2CqC,KAAK,IAAI,CAApD,EAAuD;EACnD,QAAMnC,IAAI,GAAGgC,MAAM,CAACG,KAAD,CAAnB;EACA,QAAMC,IAAI,GAAGJ,MAAM,CAACG,KAAK,GAAG,CAAT,CAAnB;EACA,QAAME,OAAO,GAAGD,IAAI,CAACH,GAAL,GAAWG,IAAI,CAACE,MAAhC;EACA,QAAMC,IAAI,GAAGvC,IAAI,CAACiC,GAAL,GAAWI,OAAxB;;EACA,QAAIE,IAAI,GAAGL,OAAX,EAAoB;EAChBD,MAAAA,GAAG,GAAGI,OAAN;EACAH,MAAAA,OAAO,GAAGK,IAAV;EACH;EACJ;;EACD,SAAON,GAAP;EACH;;EAED,SAASO,mBAAT,CAA6BR,MAA7B,EAAqC;EACjC,MAAMS,MAAM,GAAG,EAAf;;EACA,OAAK,IAAIN,KAAK,GAAG,CAAjB,EAAoBA,KAAK,GAAGH,MAAM,CAAClC,MAAnC,EAA2CqC,KAAK,IAAI,CAApD,EAAuD;EACnD,QAAMnC,IAAI,GAAGgC,MAAM,CAACG,KAAD,CAAnB;;EACA,QAAIM,MAAM,CAACzC,IAAI,CAACiC,GAAN,CAAV,EAAsB;EAClBQ,MAAAA,MAAM,CAACzC,IAAI,CAACiC,GAAN,CAAN,CAAiBS,IAAjB,CAAsB1C,IAAtB;EACH,KAFD,MAEO;EACHyC,MAAAA,MAAM,CAACzC,IAAI,CAACiC,GAAN,CAAN,GAAmB,CAACjC,IAAD,CAAnB;EACH;EACJ;;EAED,MAAI2C,QAAQ,GAAG,CAAf;EACA,MAAIV,GAAG,GAAG,CAAV;EACA,MAAMW,UAAU,GAAGC,MAAM,CAACC,IAAP,CAAYL,MAAZ,CAAnB;;EACA,OAAK,IAAIN,MAAK,GAAG,CAAjB,EAAoBA,MAAK,GAAGS,UAAU,CAAC9C,MAAvC,EAA+CqC,MAAK,IAAI,CAAxD,EAA2D;EACvD,QAAIY,QAAQ,GAAGf,MAAM,CAAC,CAAD,CAAN,CAAUgB,KAAzB;EACA,QAAMC,MAAM,GAAGL,UAAU,CAACT,MAAD,CAAzB;EACA,QAAMe,QAAQ,GAAGT,MAAM,CAACQ,MAAD,CAAvB;;EACA,SAAK,IAAId,OAAK,GAAG,CAAjB,EAAoBA,OAAK,GAAGe,QAAQ,CAACpD,MAArC,EAA6CqC,OAAK,IAAI,CAAtD,EAAyD;EACrD,UAAMgB,KAAK,GAAGD,QAAQ,CAACf,OAAD,CAAtB;;EACA,UAAIgB,KAAK,CAACC,KAAN,GAAcL,QAAlB,EAA4B;EACxBA,QAAAA,QAAQ,GAAGI,KAAK,CAACC,KAAjB;EACH;EACJ;;EAED,QAAIL,QAAQ,GAAGJ,QAAf,EAAyB;EACrBA,MAAAA,QAAQ,GAAGI,QAAX;;EADqB,oCAETG,QAFS;;EAElBjB,MAAAA,GAFkB,gBAElBA,GAFkB;EAGxB;EACJ;;EAED,MAAIA,GAAG,KAAK,CAAZ,EAAe;EACX,QAAMoB,SAAS,GAAGC,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,MAAL,MAAiB,IAAIZ,UAAU,CAAC9C,MAAhC,IAA0C8C,UAAU,CAAC9C,MAArD,GAA8D,CAAzE,CAAlB;EACAmC,IAAAA,GAAG,GAAGW,UAAU,CAACS,SAAD,CAAhB;EACH;;EAED,SAAOpB,GAAP;EACH;;AAED,EAAe,SAASwB,WAAT,CAAqBzB,MAArB,EAA6B;EACxC,MAAIC,GAAG,GAAGF,iBAAiB,CAACC,MAAD,CAA3B;;EACA,MAAIC,GAAG,KAAK,CAAZ,EAAe;EACXA,IAAAA,GAAG,GAAGO,mBAAmB,CAACR,MAAD,CAAzB;EACH;;EACD,SAAOC,GAAP;EACH;;MC1DoByB;;;EACjB,mBAAYC,GAAZ,EAAiBC,MAAjB,EAAyB;EAAA;;EAAA;;EACrB,SAAKD,GAAL,GAAWA,GAAX;EACA,SAAKE,KAAL,GAAa,EAAb;EACA,SAAKC,IAAL,GAAY,EAAZ;EACA,SAAKF,MAAL,GAAc,EAAd;EACA,SAAKG,MAAL,CAAYH,MAAZ;EACA,SAAKI,MAAL,GAAc,KAAd;EACA,SAAKC,mBAAL,GAA2B,IAA3B;EACA,SAAKC,QAAL,GAAgBP,GAAG,CAACQ,QAAJ,CAAaD,QAA7B;EACAP,IAAAA,GAAG,CAACS,IAAJ,CAASC,MAAT,CAAgBX,OAAO,CAACU,IAAxB;EACAT,IAAAA,GAAG,CAACW,EAAJ,CAAO,YAAP,EAAqB,KAAKC,KAAL,CAAWC,IAAX,CAAgB,IAAhB,CAArB;EACAb,IAAAA,GAAG,CAACW,EAAJ,CAAO,eAAP,EAAwB,KAAKC,KAAL,CAAWC,IAAX,CAAgB,IAAhB,CAAxB;EACAb,IAAAA,GAAG,CAACW,EAAJ,CAAO,aAAP,EAAsB,KAAKG,IAAL,CAAUD,IAAV,CAAe,IAAf,CAAtB;EACAb,IAAAA,GAAG,CAACW,EAAJ,CAAO,eAAP,EAAwB,KAAKG,IAAL,CAAUD,IAAV,CAAe,IAAf,CAAxB;EACAb,IAAAA,GAAG,CAACW,EAAJ,CAAO,QAAP,EAAiB,KAAKI,MAAL,CAAYF,IAAZ,CAAiB,IAAjB,CAAjB;EACAb,IAAAA,GAAG,CAACW,EAAJ,CAAO,SAAP,EAAkB,KAAKG,IAAL,CAAUD,IAAV,CAAe,IAAf,CAAlB;;EACA,QAAI,OAAO,KAAKZ,MAAL,CAAYe,OAAnB,KAA+B,UAAnC,EAA+C;EAC3C,WAAKf,MAAL,CAAYe,OAAZ,GAAsBxD,IAAtB,CAA2B,UAAAa,MAAM,EAAI;EACjCA,QAAAA,MAAM,CAAC4C,OAAP,CAAe,KAAI,CAACC,UAAL,CAAgBL,IAAhB,CAAqB,KAArB,CAAf;EACAb,QAAAA,GAAG,CAACmB,IAAJ,CAAS,+BAAT;EACH,OAHD;EAIH,KALD,MAKO,IAAI,OAAO,KAAKlB,MAAL,CAAYe,OAAnB,KAA+B,QAAnC,EAA6C;EAChD3D,MAAAA,yBAAyB,CAAC,KAAK4C,MAAL,CAAYe,OAAb,CAAzB,CAA+CxD,IAA/C,CAAoD,UAAAa,MAAM,EAAI;EAC1DA,QAAAA,MAAM,CAAC4C,OAAP,CAAe,KAAI,CAACC,UAAL,CAAgBL,IAAhB,CAAqB,KAArB,CAAf;EACAb,QAAAA,GAAG,CAACmB,IAAJ,CAAS,+BAAT;EACH,OAHD;EAIH,KALM,MAKA;EACH,WAAKlB,MAAL,CAAYe,OAAZ,CAAoBC,OAApB,CAA4B,KAAKC,UAAL,CAAgBL,IAAhB,CAAqB,IAArB,CAA5B;EACAb,MAAAA,GAAG,CAACmB,IAAJ,CAAS,+BAAT;EACH;EACJ;;;;6BA0CMlB,QAAQ;EAAA,kCAIP,KAAKD,GAAL,CAASoB,WAJF;EAAA,UAEEC,KAFF,yBAEPC,KAFO,CAEED,KAFF;EAAA,UAGPE,SAHO,yBAGPA,SAHO;EAKX,WAAKtB,MAAL,GAAcf,MAAM,CAACsC,MAAP,CAAc,EAAd,EAAkBzB,OAAO,CAACE,MAA1B,EAAkC,KAAKA,MAAvC,EAA+CA,MAA/C,CAAd;EACAsB,MAAAA,SAAS,CAAC,KAAKtB,MAAN,EAAcF,OAAO,CAAC0B,MAAtB,CAAT;EACA,WAAKxB,MAAL,CAAYyB,KAAZ,GAAoBL,KAAK,CAAC,KAAKpB,MAAL,CAAYyB,KAAb,EAAoB,CAApB,EAAuB,EAAvB,CAAzB;EACA,WAAKzB,MAAL,CAAY0B,SAAZ,GAAwBN,KAAK,CAAC,KAAKpB,MAAL,CAAY0B,SAAb,EAAwB,EAAxB,EAA4B,GAA5B,CAA7B;EACA,WAAK1B,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,IAAwBP,KAAK,CAAC,KAAKpB,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CAAD,EAAwB,CAAxB,EAA2B,GAA3B,CAA7B;EACA,WAAK3B,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,IAAwBP,KAAK,CAAC,KAAKpB,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CAAD,EAAwB,CAAxB,EAA2B,GAA3B,CAA7B;EACA,WAAK3B,MAAL,CAAY4B,OAAZ,GAAsBR,KAAK,CAAC,KAAKpB,MAAL,CAAY4B,OAAb,EAAsB,CAAtB,EAAyB,CAAzB,CAA3B;EACA,WAAK5B,MAAL,CAAYnD,QAAZ,GAAuBuE,KAAK,CAAC,KAAKpB,MAAL,CAAYnD,QAAb,EAAuB,EAAvB,EAA2B,EAA3B,CAA5B;EACA,WAAKkD,GAAL,CAASmB,IAAT,CAAc,+BAAd,EAA+C,KAAKlB,MAApD;EACH;;;2BAEIT,OAAO;EAAA,UACAsC,OADA,GACY,KAAK9B,GAAL,CAASQ,QADrB,CACAsB,OADA;EAERtC,MAAAA,KAAK,CAACuC,IAAN,GAAa,KAAKC,WAAL,EAAb;EACAxC,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBJ,OAAjB,GAA2B,KAAK5B,MAAL,CAAY4B,OAAvC;EACArC,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBnF,QAAjB,aAA+B,KAAKmD,MAAL,CAAYnD,QAA3C;EACA0C,MAAAA,KAAK,CAACuC,IAAN,CAAWG,SAAX,GAAuB1C,KAAK,CAACjD,IAA7B;EACAiD,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBlF,KAAjB,GAAyByC,KAAK,CAACzC,KAA/B;EACA,UAAMoF,WAAW,GAAGpC,OAAO,CAACqC,OAAR,CAAgBN,OAAhB,EAAyB,OAAzB,CAApB;EACA,UAAMO,UAAU,GAAGtC,OAAO,CAACqC,OAAR,CAAgB5C,KAAK,CAACuC,IAAtB,EAA4B,OAA5B,CAAnB;EACAvC,MAAAA,KAAK,CAAC8C,UAAN,GAAmBH,WAAW,GAAGE,UAAd,GAA2B,CAA9C;EACA7C,MAAAA,KAAK,CAAC+C,SAAN,GAAkB,KAAKtC,MAAL,CAAYyB,KAA9B;EACAlC,MAAAA,KAAK,CAACgD,cAAN,GAAuBC,IAAI,CAACC,GAAL,EAAvB;EACAlD,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBU,IAAjB,aAA2BR,WAA3B;EACA3C,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiB3D,GAAjB,aAA0B,KAAKwB,WAAL,EAA1B;EACAN,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBW,SAAjB,wBAA2C,CAACpD,KAAK,CAAC8C,UAAlD;EACA9C,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBY,UAAjB,uBAA2CrD,KAAK,CAAC+C,SAAjD;;EACA,UAAI/C,KAAK,CAACsD,MAAV,EAAkB;EACdtD,QAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBa,MAAjB,uBAAuCtD,KAAK,CAACsD,MAA7C;EACH;;EACDtD,MAAAA,KAAK,CAACuD,MAAN,GAAe,MAAf;EACH;;;+BASQ;EAAA,UACGjB,OADH,GACe,KAAK9B,GAAL,CAASQ,QADxB,CACGsB,OADH;;EAAA,6BAE0B/B,OAAO,CAACqC,OAAR,CAAgBN,OAAhB,CAF1B;EAAA,UAEUK,WAFV,oBAEG9C,KAFH;;EAGL,WAAKa,KAAL,CAAWe,OAAX,CAAmB,UAAAzB,KAAK,EAAI;EACxBA,QAAAA,KAAK,CAACuD,MAAN,GAAe,MAAf;EACH,OAFD;EAGA,WAAK5C,IAAL,CAAUc,OAAV,CAAkB,UAAAc,IAAI,EAAI;EACtBA,QAAAA,IAAI,CAACE,KAAL,CAAWU,IAAX,aAAqBR,WAArB;EACAJ,QAAAA,IAAI,CAACE,KAAL,CAAWa,MAAX,GAAoB,MAApB;EACAf,QAAAA,IAAI,CAACE,KAAL,CAAWW,SAAX,GAAuB,iDAAvB;EACAb,QAAAA,IAAI,CAACE,KAAL,CAAWY,UAAX,GAAwB,wBAAxB;EACH,OALD;EAMH;;;8BAEOrD,OAAO;EAAA,UACHsC,OADG,GACS,KAAK9B,GAAL,CAASQ,QADlB,CACHsB,OADG;;EAAA,8BAEsC/B,OAAO,CAACqC,OAAR,CAAgBN,OAAhB,CAFtC;EAAA,UAEGkB,UAFH,qBAEHL,IAFG;EAAA,UAEsBR,WAFtB,qBAEe9C,KAFf;;EAAA,8BAGiBU,OAAO,CAACqC,OAAR,CAAgB5C,KAAK,CAACuC,IAAtB,CAHjB;EAAA,UAGGkB,SAHH,qBAGHN,IAHG;;EAIXnD,MAAAA,KAAK,CAAC+C,SAAN,IAAmB,CAACE,IAAI,CAACC,GAAL,KAAalD,KAAK,CAACgD,cAApB,IAAsC,IAAzD;EACA,UAAMU,UAAU,GAAGf,WAAW,IAAIc,SAAS,GAAGD,UAAhB,CAAX,GAAyC,CAA5D;EACAxD,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBW,SAAjB,wBAA2C,CAACM,UAA5C;EACA1D,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBY,UAAjB,GAA8B,wBAA9B;EACArD,MAAAA,KAAK,CAACuD,MAAN,GAAe,MAAf;EACH;;;iCAEUvD,OAAO;EAAA,sBACmB,KAAKQ,GADxB;EAAA,UACNmD,MADM,aACNA,MADM;EAAA,UACEC,MADF,aACEA,MADF;EAAA,UACU3C,IADV,aACUA,IADV;;EAEd,UAAI,CAACjB,KAAK,CAACjD,IAAN,CAAWG,IAAX,EAAL,EAAwB;EACpByG,QAAAA,MAAM,CAACE,IAAP,CAAY5C,IAAI,CAAC6C,GAAL,CAAS,4BAAT,CAAZ;EACA;EACH;;EAED,UAAI9D,KAAK,CAACjD,IAAN,CAAWJ,MAAX,GAAoB,KAAK8D,MAAL,CAAY0B,SAApC,EAA+C;EAC3CwB,QAAAA,MAAM,CAACE,IAAP,WAAe5C,IAAI,CAAC6C,GAAL,CAAS,yCAAT,CAAf,cAAsE,KAAKrD,MAAL,CAAY0B,SAAlF;EACA;EACH;;EAED,UAAI,OAAOnC,KAAK,CAAC7C,IAAb,KAAsB,QAA1B,EAAoC;EAChC6C,QAAAA,KAAK,CAAC7C,IAAN,GAAayG,MAAM,CAACG,WAApB;EACH;;EAED,WAAKrD,KAAL,CAAWnB,IAAX,kBACOS,KADP;EAEIuD,QAAAA,MAAM,EAAE,MAFZ;EAGIhB,QAAAA,IAAI,EAAE,IAHV;EAIIQ,QAAAA,SAAS,EAAE,CAJf;EAKIC,QAAAA,cAAc,EAAE;EALpB;EAOH;;;oCAEa;EAAA,UACFV,OADE,GACU,KAAK9B,GAAL,CAASQ,QADnB,CACFsB,OADE;EAAA,mCAEoB,KAAK9B,GAAL,CAASoB,WAAT,CAAqBE,KAFzC;EAAA,UAEFkC,SAFE,0BAEFA,SAFE;EAAA,UAESC,MAFT,0BAESA,MAFT;EAGV,UAAMT,UAAU,GAAGjD,OAAO,CAACqC,OAAR,CAAgBN,OAAhB,EAAyB,MAAzB,CAAnB;EAEA,UAAM4B,SAAS,GAAG,KAAKxD,KAAL,CAAWyD,IAAX,CAAgB,UAAAnE,KAAK,EAAI;EACvC,YAAIA,KAAK,CAACuC,IAAV,EAAgB;EAAA,kCACmChC,OAAO,CAACqC,OAAR,CAAgB5C,KAAK,CAACuC,IAAtB,CADnC;EAAA,cACEkB,SADF,qBACJN,IADI;EAAA,cACoBN,UADpB,qBACahD,KADb;;EAEZ,iBAAOG,KAAK,CAACuD,MAAN,KAAiB,MAAjB,IAA2BC,UAAU,GAAGC,SAAS,GAAGZ,UAA3D;EACH;;EACD,eAAO,KAAP;EACH,OANiB,CAAlB;;EAQA,UAAIqB,SAAJ,EAAe;EACXA,QAAAA,SAAS,CAACX,MAAV,GAAmB,MAAnB;EACAW,QAAAA,SAAS,CAAC3B,IAAV,CAAeE,KAAf,CAAqBa,MAArB,GAA8B,MAA9B;EACAY,QAAAA,SAAS,CAAC3B,IAAV,CAAeE,KAAf,CAAqBW,SAArB,GAAiC,iDAAjC;EACAc,QAAAA,SAAS,CAAC3B,IAAV,CAAeE,KAAf,CAAqBY,UAArB,GAAkC,wBAAlC;EACA,aAAKtC,QAAL,CAAcqD,WAAd,CAA0BF,SAAS,CAAC3B,IAApC;EACA,eAAO2B,SAAS,CAAC3B,IAAjB;EACH;;EAED,UAAMA,IAAI,GAAG8B,QAAQ,CAACC,aAAT,CAAuB,KAAvB,CAAb;EAEAN,MAAAA,SAAS,CAACzB,IAAD,EAAO;EACZgC,QAAAA,UAAU,EAAE,MADA;EAEZC,QAAAA,QAAQ,EAAE,UAFE;EAGZC,QAAAA,UAAU,EAAE,KAHA;EAIZC,QAAAA,aAAa,EAAE,MAJH;EAKZC,QAAAA,WAAW,EAAE,OALD;EAMZC,QAAAA,OAAO,EAAE,cANG;EAOZC,QAAAA,UAAU,EAAE,WAPA;EAQZC,QAAAA,UAAU,EAAE,4DARA;EASZC,QAAAA,UAAU,EAAE,QATA;EAUZC,QAAAA,UAAU,EAAE,OAVA;EAWZC,QAAAA,UAAU,EACN;EAZQ,OAAP,CAAT;EAeAhB,MAAAA,MAAM,CAAC,KAAKlD,QAAN,EAAgBwB,IAAhB,CAAN;EACA,WAAK5B,IAAL,CAAUpB,IAAV,CAAegD,IAAf;EACA,aAAOA,IAAP;EACH;;;sCAEa;EAAA,UACFD,OADE,GACU,KAAK9B,GAAL,CAASQ,QADnB,CACFsB,OADE;;EAAA,8BAE6E/B,OAAO,CAACqC,OAAR,CAAgBN,OAAhB,CAF7E;EAAA,UAEIkB,UAFJ,qBAEFL,IAFE;EAAA,UAEqB+B,SAFrB,qBAEgBpG,GAFhB;EAAA,UAEwCqG,YAFxC,qBAEgChG,MAFhC;EAAA,UAE6DwD,WAF7D,qBAEsD9C,KAFtD;;EAGV,UAAMhB,MAAM,GAAG,KAAK6B,KAAL,CAAW0E,MAAX,CAAkB,UAAApF,KAAK;EAAA,eAAIA,KAAK,CAACuD,MAAN,KAAiB,MAArB;EAAA,OAAvB,CAAf;;EAEA,UAAI1E,MAAM,CAAClC,MAAP,KAAkB,CAAtB,EAAyB;EACrB,eAAO,KAAK8D,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CAAP;EACH;;EAED,UAAMiD,YAAY,GAAGxG,MAAM,CACtBjC,GADgB,CACZ,UAAAoD,KAAK,EAAI;EAAA,gCACyEO,OAAO,CAACqC,OAAR,CAC/E5C,KAAK,CAACuC,IADyE,CADzE;EAAA,YACIkB,SADJ,qBACFN,IADE;EAAA,YACoBmC,QADpB,qBACexG,GADf;EAAA,YACqC+D,UADrC,qBAC8BhD,KAD9B;EAAA,YACyD0F,WADzD,qBACiDpG,MADjD;;EAIV,YAAML,GAAG,GAAGwG,QAAQ,GAAGJ,SAAvB;EACA,YAAM/B,IAAI,GAAGM,SAAS,GAAGD,UAAzB;EACA,YAAMvD,KAAK,GAAG0C,WAAW,GAAGQ,IAAd,GAAqBN,UAAnC;EACA,eAAO;EACH/D,UAAAA,GAAG,EAAHA,GADG;EAEHqE,UAAAA,IAAI,EAAJA,IAFG;EAGHlD,UAAAA,KAAK,EAALA,KAHG;EAIHd,UAAAA,MAAM,EAAEoG,WAJL;EAKH1F,UAAAA,KAAK,EAAEgD;EALJ,SAAP;EAOH,OAfgB,EAgBhB2C,IAhBgB,CAgBX,UAACvG,IAAD,EAAOwG,IAAP,EAAgB;EAClB,eAAOxG,IAAI,CAACH,GAAL,GAAW2G,IAAI,CAAC3G,GAAvB;EACH,OAlBgB,CAArB;EAoBAuG,MAAAA,YAAY,CAACK,OAAb,CAAqB;EACjB5G,QAAAA,GAAG,EAAE,CADY;EAEjBqE,QAAAA,IAAI,EAAE,CAFW;EAGjBlD,QAAAA,KAAK,EAAE,CAHU;EAIjBd,QAAAA,MAAM,EAAE,KAAKsB,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CAJS;EAKjBvC,QAAAA,KAAK,EAAE8C;EALU,OAArB;EAQA0C,MAAAA,YAAY,CAAC9F,IAAb,CAAkB;EACdT,QAAAA,GAAG,EAAEqG,YAAY,GAAG,KAAK1E,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CADN;EAEde,QAAAA,IAAI,EAAE,CAFQ;EAGdlD,QAAAA,KAAK,EAAE,CAHO;EAIdd,QAAAA,MAAM,EAAE,KAAKsB,MAAL,CAAY2B,MAAZ,CAAmB,CAAnB,CAJM;EAKdvC,QAAAA,KAAK,EAAE8C;EALO,OAAlB;EAQA,aAAOrC,WAAW,CAAC+E,YAAD,CAAlB;EACH;;;+BAEQ;EAAA;;EAAA,UACGzB,MADH,GACc,KAAKpD,GADnB,CACGoD,MADH;EAEL,WAAK9C,mBAAL,GAA2B6E,MAAM,CAACC,qBAAP,CAA6B,YAAM;EAC1D,YAAIhC,MAAM,CAACiC,OAAX,EAAoB;EAChB,UAAA,MAAI,CAACnF,KAAL,CACK0E,MADL,CACY,UAAApF,KAAK,EAAI;EACb,mBACI4D,MAAM,CAACG,WAAP,GAAqB,GAArB,IAA4B/D,KAAK,CAAC7C,IAAlC,IACA6C,KAAK,CAAC7C,IAAN,IAAcyG,MAAM,CAACG,WAAP,GAAqB,GADnC,IAEA/D,KAAK,CAACuD,MAAN,KAAiB,MAHrB;EAKH,WAPL,EAQK9B,OARL,CAQa,UAAAzB,KAAK,EAAI;EACd,YAAA,MAAI,CAAC2B,IAAL,CAAU3B,KAAV;EACH,WAVL;EAWH;;EAED,YAAI,CAAC,MAAI,CAACa,MAAV,EAAkB;EACd,UAAA,MAAI,CAACK,MAAL;EACH;EACJ,OAlB0B,CAA3B;EAmBH;;;6BAEM;EAAA;;EACH,WAAKL,MAAL,GAAc,IAAd;EACA,WAAKH,KAAL,CACK0E,MADL,CACY,UAAApF,KAAK;EAAA,eAAIA,KAAK,CAACuD,MAAN,KAAiB,MAArB;EAAA,OADjB,EAEK9B,OAFL,CAEa,UAAAzB,KAAK,EAAI;EACd,QAAA,MAAI,CAAC8F,OAAL,CAAa9F,KAAb;EACH,OAJL;EAKA2F,MAAAA,MAAM,CAACI,oBAAP,CAA4B,KAAKjF,mBAAjC;EACA,WAAKN,GAAL,CAASmB,IAAT,CAAc,6BAAd;EACH;;;8BAEO;EACJ,WAAKd,MAAL,GAAc,KAAd;EACA,WAAKH,KAAL,CACK0E,MADL,CACY,UAAApF,KAAK;EAAA,eAAIA,KAAK,CAACuD,MAAN,KAAiB,MAArB;EAAA,OADjB,EAEK9B,OAFL,CAEa,UAAAzB,KAAK,EAAI;EACdO,QAAAA,OAAO,YAAP,CAAiBP,KAAjB;EACH,OAJL;EAKA,WAAKkB,MAAL;EACA,WAAKV,GAAL,CAASmB,IAAT,CAAc,8BAAd;EACH;;;6BAEM;EACH,WAAKZ,QAAL,CAAc0B,KAAd,GAAsB,OAAtB;EACA,WAAKjC,GAAL,CAASmB,IAAT,CAAc,6BAAd;EACH;;;6BAEM;EACH,WAAKZ,QAAL,CAAc0B,KAAd,GAAsB,MAAtB;EACA,WAAKjC,GAAL,CAASmB,IAAT,CAAc,6BAAd;EACH;;;8BArPcqE,KAAKC,KAAK;EACrB,UAAMC,MAAM,GAAGF,GAAG,CAACG,qBAAJ,EAAf;EACA,aAAOF,GAAG,GAAGC,MAAM,CAACD,GAAD,CAAT,GAAiBC,MAA3B;EACH;;;gCAwCelG,OAAO;EACnBA,MAAAA,KAAK,CAACgD,cAAN,GAAuBC,IAAI,CAACC,GAAL,EAAvB;EACAlD,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBW,SAAjB,wBAA2C,CAACpD,KAAK,CAAC8C,UAAlD;EACA9C,MAAAA,KAAK,CAACuC,IAAN,CAAWE,KAAX,CAAiBY,UAAjB,uBAA2CrD,KAAK,CAAC+C,SAAjD;EACA/C,MAAAA,KAAK,CAACuD,MAAN,GAAe,MAAf;EACH;;;0BAnFiB;EACd,aAAO;EACH,iBAAS;EACL,wCAA8B,UADzB;EAEL,qDAA2C;EAFtC,SADN;EAKH,iBAAS;EACL,wCAA8B,UADzB;EAEL,qDAA2C;EAFtC;EALN,OAAP;EAUH;;;0BAEmB;EAChB,aAAO;EACH/B,QAAAA,OAAO,EAAE,EADN;EAEHU,QAAAA,KAAK,EAAE,CAFJ;EAGHC,QAAAA,SAAS,EAAE,EAHR;EAIHC,QAAAA,MAAM,EAAE,CAAC,EAAD,EAAK,GAAL,CAJL;EAKHC,QAAAA,OAAO,EAAE,CALN;EAMH/E,QAAAA,QAAQ,EAAE;EANP,OAAP;EAQH;;;0BAEmB;EAChB,aAAO;EACHkE,QAAAA,OAAO,EAAE,uBADN;EAEHU,QAAAA,KAAK,EAAE,QAFJ;EAGHC,QAAAA,SAAS,EAAE,QAHR;EAIHC,QAAAA,MAAM,EAAE,OAJL;EAKHC,QAAAA,OAAO,EAAE,QALN;EAMH/E,QAAAA,QAAQ,EAAE;EANP,OAAP;EAQH;;;;;;ACrEL,aAAe;EACX,WAAS;EACL,qBAAiB,OADZ;EAEL,mBAAe,MAFV;EAGL,kBAAc;EAHT,GADE;EAMX,WAAS;EACL,qBAAiB,OADZ;EAEL,mBAAe,MAFV;EAGL,kBAAc;EAHT;EANE,CAAf;;ECAe,SAAS8I,OAAT,CAAiB5F,GAAjB,EAAsB;EAAA,MAE7BS,IAF6B,GAI7BT,GAJ6B,CAE7BS,IAF6B;EAAA,MAGnBoF,KAHmB,GAI7B7F,GAJ6B,CAG7B8F,MAH6B,CAGnBD,KAHmB;EAMjC,SAAO;EACHE,IAAAA,IAAI,EAAE,iBADH;EAEHvH,IAAAA,KAAK,EAAE,EAFJ;EAGHwH,IAAAA,IAAI,8EAEMvF,IAAI,CAAC6C,GAAL,CAAS,eAAT,CAFN,oOAHD;EAWH2C,IAAAA,OAAO,EAAE,iBAAAC,QAAQ,EAAI;EACjB,UAAMC,MAAM,GAAGD,QAAQ,CAACE,aAAT,CAAuB,mBAAvB,CAAf;EACA,UAAMC,MAAM,GAAGH,QAAQ,CAACE,aAAT,CAAuB,YAAvB,CAAf;EACAP,MAAAA,KAAK,CAACM,MAAD,EAAS,QAAT,EAAmB,YAAM;EAAA,YAClBG,KADkB,GACRH,MADQ,CAClBG,KADkB;EAE1BD,QAAAA,MAAM,CAACnE,SAAP,GAAmBtF,MAAM,CAAC0J,KAAD,CAAN,GAAgB,GAAnC;EAEAtG,QAAAA,GAAG,CAACuG,OAAJ,CAAYC,sBAAZ,CAAmCpG,MAAnC,CAA0C;EACtCyB,UAAAA,OAAO,EAAEjF,MAAM,CAAC0J,KAAD;EADuB,SAA1C;EAIAtG,QAAAA,GAAG,CAACW,EAAJ,CAAO,+BAAP,EAAwC,UAAAP,MAAM,EAAI;EAC9C,cAAI+F,MAAM,CAACG,KAAP,KAAiBlG,MAAM,CAACyB,OAA5B,EAAqC;EACjCsE,YAAAA,MAAM,CAACG,KAAP,GAAelG,MAAM,CAACyB,OAAtB;EACAwE,YAAAA,MAAM,CAACnE,SAAP,GAAmB9B,MAAM,CAACyB,OAAP,GAAiB,GAApC;EACH;EACJ,SALD;EAMH,OAdI,CAAL;EAeH;EA7BE,GAAP;EA+BH;;ECrCc,SAAS+D,SAAT,CAAiB5F,GAAjB,EAAsB;EAAA,MAE7BS,IAF6B,GAI7BT,GAJ6B,CAE7BS,IAF6B;EAAA,MAGnBoF,KAHmB,GAI7B7F,GAJ6B,CAG7B8F,MAH6B,CAGnBD,KAHmB;EAMjC,SAAO;EACHE,IAAAA,IAAI,EAAE,eADH;EAEHvH,IAAAA,KAAK,EAAE,EAFJ;EAGHwH,IAAAA,IAAI,8EAEMvF,IAAI,CAAC6C,GAAL,CAAS,aAAT,CAFN,+NAHD;EAWH2C,IAAAA,OAAO,EAAE,iBAAAC,QAAQ,EAAI;EACjB,UAAMC,MAAM,GAAGD,QAAQ,CAACE,aAAT,CAAuB,mBAAvB,CAAf;EACA,UAAMC,MAAM,GAAGH,QAAQ,CAACE,aAAT,CAAuB,YAAvB,CAAf;EACAP,MAAAA,KAAK,CAACM,MAAD,EAAS,QAAT,EAAmB,YAAM;EAAA,YAClBG,KADkB,GACRH,MADQ,CAClBG,KADkB;EAE1BD,QAAAA,MAAM,CAACnE,SAAP,GAAmBoE,KAAnB;EAEAtG,QAAAA,GAAG,CAACuG,OAAJ,CAAYC,sBAAZ,CAAmCpG,MAAnC,CAA0C;EACtCsB,UAAAA,KAAK,EAAE9E,MAAM,CAAC0J,KAAD;EADyB,SAA1C;EAIAtG,QAAAA,GAAG,CAACW,EAAJ,CAAO,+BAAP,EAAwC,UAAAP,MAAM,EAAI;EAC9C,cAAI+F,MAAM,CAACG,KAAP,KAAiBlG,MAAM,CAACsB,KAA5B,EAAmC;EAC/ByE,YAAAA,MAAM,CAACG,KAAP,GAAelG,MAAM,CAACsB,KAAtB;EACA2E,YAAAA,MAAM,CAACnE,SAAP,GAAmB9B,MAAM,CAACsB,KAA1B;EACH;EACJ,SALD;EAMH,OAdI,CAAL;EAeH;EA7BE,GAAP;EA+BH;;ECrCc,SAASkE,SAAT,CAAiB5F,GAAjB,EAAsB;EAAA,MAE7BS,IAF6B,GAI7BT,GAJ6B,CAE7BS,IAF6B;EAAA,MAGnBoF,KAHmB,GAI7B7F,GAJ6B,CAG7B8F,MAH6B,CAGnBD,KAHmB;EAMjC,SAAO;EACHE,IAAAA,IAAI,EAAE,cADH;EAEHvH,IAAAA,KAAK,EAAE,EAFJ;EAGHwH,IAAAA,IAAI,8EAEMvF,IAAI,CAAC6C,GAAL,CAAS,YAAT,CAFN,mOAHD;EAWH2C,IAAAA,OAAO,EAAE,iBAAAC,QAAQ,EAAI;EACjB,UAAMC,MAAM,GAAGD,QAAQ,CAACE,aAAT,CAAuB,mBAAvB,CAAf;EACA,UAAMC,MAAM,GAAGH,QAAQ,CAACE,aAAT,CAAuB,YAAvB,CAAf;EACAP,MAAAA,KAAK,CAACM,MAAD,EAAS,QAAT,EAAmB,YAAM;EAAA,YAClBG,KADkB,GACRH,MADQ,CAClBG,KADkB;EAE1BD,QAAAA,MAAM,CAACnE,SAAP,GAAmBoE,KAAnB;EAEAtG,QAAAA,GAAG,CAACuG,OAAJ,CAAYC,sBAAZ,CAAmCpG,MAAnC,CAA0C;EACtCtD,UAAAA,QAAQ,EAAEF,MAAM,CAAC0J,KAAD;EADsB,SAA1C;EAIAtG,QAAAA,GAAG,CAACW,EAAJ,CAAO,+BAAP,EAAwC,UAAAP,MAAM,EAAI;EAC9C,cAAI+F,MAAM,CAACG,KAAP,KAAiBlG,MAAM,CAACtD,QAA5B,EAAsC;EAClCqJ,YAAAA,MAAM,CAACG,KAAP,GAAelG,MAAM,CAACtD,QAAtB;EACAuJ,YAAAA,MAAM,CAACnE,SAAP,GAAmB9B,MAAM,CAACtD,QAA1B;EACH;EACJ,SALD;EAMH,OAdI,CAAL;EAeH;EA7BE,GAAP;EA+BH;;EC9BD,SAAS0J,sBAAT,CAAgCvG,MAAhC,EAAwC;EACpC,SAAO,UAAAD,GAAG,EAAI;EACV,QAAMgB,OAAO,GAAG,IAAIjB,OAAJ,CAAYC,GAAZ,EAAiBC,MAAjB,CAAhB;EACAD,IAAAA,GAAG,CAACS,IAAJ,CAASC,MAAT,CAAgBD,IAAhB;EACAT,IAAAA,GAAG,CAAC4F,OAAJ,CAAYa,GAAZ,CAAgBC,OAAhB;EACA1G,IAAAA,GAAG,CAAC4F,OAAJ,CAAYa,GAAZ,CAAgBE,SAAhB;EACA3G,IAAAA,GAAG,CAAC4F,OAAJ,CAAYa,GAAZ,CAAgBG,SAAhB;EACA,WAAO;EACHb,MAAAA,IAAI,EAAE,wBADH;EAEH5E,MAAAA,IAAI,EAAEH,OAAO,CAACE,UAAR,CAAmBL,IAAnB,CAAwBG,OAAxB,CAFH;EAGHZ,MAAAA,MAAM,EAAEY,OAAO,CAACZ,MAAR,CAAeS,IAAf,CAAoBG,OAApB,CAHL;EAIHJ,MAAAA,KAAK,EAAEI,OAAO,CAACJ,KAAR,CAAcC,IAAd,CAAmBG,OAAnB,CAJJ;EAKHF,MAAAA,IAAI,EAAEE,OAAO,CAACF,IAAR,CAAaD,IAAb,CAAkBG,OAAlB,CALH;EAMH6F,MAAAA,IAAI,EAAE7F,OAAO,CAAC6F,IAAR,CAAahG,IAAb,CAAkBG,OAAlB,CANH;EAOHqC,MAAAA,IAAI,EAAErC,OAAO,CAACqC,IAAR,CAAaxC,IAAb,CAAkBG,OAAlB;EAPH,KAAP;EASH,GAfD;EAgBH;;EAEDwF,sBAAsB,CAACM,QAAvB,GAAkCA,QAAlC;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"artplayer-plugin-danmuku.js","sources":["../../node_modules/@babel/runtime/helpers/defineProperty.js","../../node_modules/@babel/runtime/helpers/objectSpread.js","../../node_modules/@babel/runtime/helpers/classCallCheck.js","../../node_modules/@babel/runtime/helpers/createClass.js","../../packages/artplayer-plugin-danmuku/src/i18n.js","../../packages/artplayer-plugin-danmuku/src/setting.js","../../packages/artplayer-plugin-danmuku/src/utils.js","../../node_modules/@babel/runtime/helpers/arrayWithHoles.js","../../node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","../../node_modules/@babel/runtime/helpers/nonIterableRest.js","../../node_modules/@babel/runtime/helpers/slicedToArray.js","../../packages/artplayer-plugin-danmuku/src/bilibili.js","../../packages/artplayer-plugin-danmuku/src/getDanmuTop.js","../../packages/artplayer-plugin-danmuku/src/danmuku.js","../../packages/artplayer-plugin-danmuku/src/index.js"],"sourcesContent":["function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nmodule.exports = _defineProperty;","var defineProperty = require(\"./defineProperty\");\n\nfunction _objectSpread(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n var ownKeys = Object.keys(source);\n\n if (typeof Object.getOwnPropertySymbols === 'function') {\n ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {\n return Object.getOwnPropertyDescriptor(source, sym).enumerable;\n }));\n }\n\n ownKeys.forEach(function (key) {\n defineProperty(target, key, source[key]);\n });\n }\n\n return target;\n}\n\nmodule.exports = _objectSpread;","function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nmodule.exports = _createClass;","export default {\n 'zh-cn': {\n 'Danmu opacity': '弹幕透明度',\n 'Danmu speed': '弹幕速度',\n 'Danmu size': '弹幕大小',\n 'Danmu text cannot be empty': '弹幕文本不能为空',\n 'The length of the danmu does not exceed': '弹幕文本字数不能超过',\n },\n 'zh-tw': {\n 'Danmu opacity': '彈幕透明度',\n 'Danmu speed': '彈幕速度',\n 'Danmu size': '弹幕大小',\n 'Danmu text cannot be empty': '彈幕文本不能為空',\n 'The length of the danmu does not exceed': '彈幕文本字數不能超過',\n },\n};","export function opacity(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-opacity',\n index: 30,\n html: `\n
\n ${i18n.get('Danmu opacity')}: 100%\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = Number(value) * 100;\n\n art.plugins.artplayerPluginDanmuku.config({\n opacity: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.opacity) {\n $range.value = config.opacity;\n $value.innerText = config.opacity * 100;\n }\n });\n });\n },\n };\n}\n\nexport function size(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-size',\n index: 50,\n html: `\n
\n ${i18n.get('Danmu size')}: 25px\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = value;\n\n art.plugins.artplayerPluginDanmuku.config({\n fontSize: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.fontSize) {\n $range.value = config.fontSize;\n $value.innerText = config.fontSize;\n }\n });\n });\n },\n };\n}\n\nexport function speed(art) {\n const {\n i18n,\n events: { proxy },\n } = art;\n\n return {\n name: 'danmuku-speed',\n index: 40,\n html: `\n
\n ${i18n.get('Danmu speed')}: 5s\n
\n
\n \n
\n `,\n mounted: $setting => {\n const $range = $setting.querySelector('input[type=range]');\n const $value = $setting.querySelector('.art-value');\n proxy($range, 'change', () => {\n const { value } = $range;\n $value.innerText = value;\n\n art.plugins.artplayerPluginDanmuku.config({\n speed: Number(value),\n });\n\n art.on('artplayerPluginDanmuku:config', config => {\n if ($range.value !== config.speed) {\n $range.value = config.speed;\n $value.innerText = config.speed;\n }\n });\n });\n },\n };\n}\n","export function filter(queue, state, callback) {\n return queue.filter(danmu => danmu.$state === state).map(callback);\n}\n\nexport function getRect(ref, key) {\n const result = ref.getBoundingClientRect();\n return key ? result[key] : result;\n}","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nmodule.exports = _arrayWithHoles;","function _iterableToArrayLimit(arr, i) {\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nmodule.exports = _iterableToArrayLimit;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n}\n\nmodule.exports = _nonIterableRest;","var arrayWithHoles = require(\"./arrayWithHoles\");\n\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit\");\n\nvar nonIterableRest = require(\"./nonIterableRest\");\n\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || nonIterableRest();\n}\n\nmodule.exports = _slicedToArray;","export function getMode(key) {\n switch (key) {\n case 1:\n case 2:\n case 3:\n return 'scroll';\n case 4:\n case 5:\n return 'static';\n default:\n return null;\n }\n}\n\nexport function bilibiliDanmuParseFromXml(xmlString) {\n if (typeof xmlString !== 'string') return [];\n const srtList = xmlString.match(/[\\S ]*?)<\\/d>/gi);\n return srtList.length\n ? srtList.map(item => {\n const [, attrStr, text] = item.match(/(.+)<\\/d>/);\n const attr = attrStr.split(',');\n return attr.length === 8 && text.trim()\n ? {\n text,\n time: Number(attr[0]),\n mode: getMode(Number(attr[1])),\n fontSize: Number(attr[2]),\n color: `#${Number(attr[3]).toString(16)}`,\n timestamp: Number(attr[4]),\n pool: Number(attr[5]),\n userID: attr[6],\n rowID: Number(attr[7]),\n }\n : null;\n })\n : [];\n}\n\nexport function bilibiliDanmuParseFromUrl(url) {\n return fetch(url)\n .then(res => res.text())\n .then(xmlString => {\n return bilibiliDanmuParseFromXml(xmlString);\n });\n}\n\nexport function bilibiliDanmuParseFromAv(av) {\n const corsUrl = 'https://cors-anywhere.herokuapp.com/';\n return fetch(`${corsUrl}https://api.bilibili.com/x/web-interface/view?aid=${av}`)\n .then(res => res.json())\n .then(res => {\n if (res.code === 0 && res.data && res.data.cid) {\n return bilibiliDanmuParseFromUrl(`${corsUrl}https://api.bilibili.com/x/v1/dm/list.so?oid=${res.data.cid}`);\n }\n throw new Error(`Unable to get data: ${JSON.stringify(res)}`);\n });\n}","function getDanmuTopByDiff(danmus) {\n let top = 0;\n let maxDiff = 0;\n for (let index = 1; index < danmus.length; index += 1) {\n const item = danmus[index];\n const prev = danmus[index - 1];\n const prevTop = prev.top + prev.height;\n const diff = item.top - prevTop;\n if (diff > maxDiff) {\n top = prevTop;\n maxDiff = diff;\n }\n }\n return top;\n}\n\nfunction getDanmuTopBySparse(danmus) {\n const topMap = {};\n for (let index = 0; index < danmus.length; index += 1) {\n const item = danmus[index];\n if (topMap[item.top]) {\n topMap[item.top].push(item);\n } else {\n topMap[item.top] = [item];\n }\n }\n\n let maxRight = 0;\n let top = 0;\n const topMapKeys = Object.keys(topMap);\n for (let index = 0; index < topMapKeys.length; index += 1) {\n let minRight = danmus[0].width;\n const topKey = topMapKeys[index];\n const danmuArr = topMap[topKey];\n for (let index = 0; index < danmuArr.length; index += 1) {\n const danmu = danmuArr[index];\n if (danmu.right < minRight) {\n minRight = danmu.right;\n }\n }\n\n if (minRight > maxRight) {\n maxRight = minRight;\n [{ top }] = danmuArr;\n }\n }\n\n if (top === 0) {\n const randomKey = Math.floor(Math.random() * (2 - topMapKeys.length) + topMapKeys.length - 1);\n top = topMapKeys[randomKey];\n }\n\n return top;\n}\n\nexport default function getDanmuTop(danmus) {\n let top = getDanmuTopByDiff(danmus);\n if (top === 0) {\n top = getDanmuTopBySparse(danmus);\n }\n return top;\n}\n","import i18n from './i18n';\nimport { opacity, size, speed } from './setting';\nimport { filter, getRect } from './utils';\nimport { bilibiliDanmuParseFromUrl } from './bilibili';\nimport getDanmuTop from './getDanmuTop';\n\nexport default class Danmuku {\n constructor(art, option) {\n art.i18n.update(i18n);\n art.setting.add(opacity);\n art.setting.add(size);\n art.setting.add(speed);\n this.art = art;\n this.queue = [];\n this.refs = [];\n this.option = {};\n this.config(option);\n this.isStop = false;\n this.animationFrameTimer = null;\n this.$danmuku = art.template.$danmuku;\n art.on('video:play', this.start.bind(this));\n art.on('video:playing', this.start.bind(this));\n art.on('video:pause', this.stop.bind(this));\n art.on('video:waiting', this.stop.bind(this));\n art.on('destroy', this.stop.bind(this));\n if (typeof this.option.danmuku === 'function') {\n this.option.danmuku().then(danmus => {\n danmus.forEach(this.emit.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n });\n } else if (typeof this.option.danmuku === 'string') {\n bilibiliDanmuParseFromUrl(this.option.danmuku).then(danmus => {\n danmus.forEach(this.emit.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n });\n } else {\n this.option.danmuku.forEach(this.emit.bind(this));\n art.emit('artplayerPluginDanmuku:loaded');\n }\n }\n\n static get option() {\n return {\n danmuku: [],\n speed: 5,\n maxlength: 50,\n margin: [10, 100],\n opacity: 1,\n fontSize: 25,\n };\n }\n\n static get scheme() {\n return {\n danmuku: 'array|function|string',\n speed: 'number',\n maxlength: 'number',\n margin: 'array',\n opacity: 'number',\n fontSize: 'number',\n };\n }\n\n config(option) {\n const {\n utils: { clamp },\n validator,\n } = this.art.constructor;\n this.option = Object.assign({}, Danmuku.option, this.option, option);\n validator(this.option, Danmuku.scheme);\n this.option.speed = clamp(this.option.speed, 1, 10);\n this.option.maxlength = clamp(this.option.maxlength, 10, 100);\n this.option.margin[0] = clamp(this.option.margin[0], 0, 100);\n this.option.margin[1] = clamp(this.option.margin[1], 0, 100);\n this.option.opacity = clamp(this.option.opacity, 0, 1);\n this.option.fontSize = clamp(this.option.fontSize, 12, 30);\n this.art.emit('artplayerPluginDanmuku:config', this.option);\n }\n\n continue() {\n filter(this.queue, 'stop', danmu => {\n danmu.$state = 'emit';\n danmu.$lastStartTime = Date.now();\n switch (danmu.mode) {\n case 'scroll':\n danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n default:\n break;\n }\n });\n }\n\n suspend() {\n const { $player } = this.art.template;\n const { left: playerLeft, width: playerWidth } = getRect($player);\n filter(this.queue, 'emit', danmu => {\n danmu.$state = 'stop';\n const { left: danmuLeft } = getRect(danmu.$ref);\n danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000;\n const translateX = playerWidth - (danmuLeft - playerLeft) + 5;\n switch (danmu.mode) {\n case 'scroll':\n danmu.$ref.style.transform = `translateX(${-translateX}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = 'transform 0s linear 0s';\n break;\n default:\n break;\n }\n });\n }\n\n getDanmuRef() {\n const { $player } = this.art.template;\n const { setStyles, append } = this.art.constructor.utils;\n const playerLeft = getRect($player, 'left');\n\n const waitDanmu = this.queue.find(danmu => {\n if (danmu.$ref) {\n const { left: danmuLeft, width: danmuWidth } = getRect(danmu.$ref);\n return danmu.$state === 'wait' || (danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth);\n }\n return false;\n });\n\n if (waitDanmu && waitDanmu.$state === 'emit') {\n waitDanmu.$state = 'wait';\n waitDanmu.$ref.style.border = 'none';\n waitDanmu.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)';\n waitDanmu.$ref.style.transition = 'transform 0s linear 0s';\n this.$danmuku.appendChild(waitDanmu.$ref);\n return waitDanmu.$ref;\n }\n\n const $ref = document.createElement('div');\n\n setStyles($ref, {\n userSelect: 'none',\n position: 'absolute',\n whiteSpace: 'pre',\n pointerEvents: 'none',\n perspective: '500px',\n display: 'inline-block',\n willChange: 'transform',\n fontFamily: 'SimHei, \"Microsoft JhengHei\", Arial, Helvetica, sans-serif',\n fontWeight: 'normal',\n lineHeight: '1.125',\n textShadow:\n 'rgb(0, 0, 0) 1px 0px 1px, rgb(0, 0, 0) 0px 1px 1px, rgb(0, 0, 0) 0px -1px 1px, rgb(0, 0, 0) -1px 0px 1px',\n });\n\n append(this.$danmuku, $ref);\n this.refs.push($ref);\n return $ref;\n }\n\n getDanmuTop() {\n const { $player } = this.art.template;\n const { left: playerLeft, top: playerTop, height: playerHeight, width: playerWidth } = getRect($player);\n const danmus = this.queue.filter(danmu => danmu.$state === 'emit');\n\n if (danmus.length === 0) {\n return this.option.margin[0];\n }\n\n const danmusBySort = danmus\n .map(danmu => {\n const { left: danmuLeft, top: danmuTop, width: danmuWidth, height: danmuHeight } = getRect(danmu.$ref);\n const top = danmuTop - playerTop;\n const left = danmuLeft - playerLeft;\n const right = playerWidth - left - danmuWidth;\n return {\n top,\n left,\n right,\n height: danmuHeight,\n width: danmuWidth,\n };\n })\n .sort((prev, next) => {\n return prev.top - next.top;\n });\n\n danmusBySort.unshift({\n top: 0,\n left: 0,\n right: 0,\n height: this.option.margin[0],\n width: playerWidth,\n });\n\n danmusBySort.push({\n top: playerHeight - this.option.margin[1],\n left: 0,\n right: 0,\n height: this.option.margin[1],\n width: playerWidth,\n });\n\n return getDanmuTop(danmusBySort);\n }\n\n update() {\n const {\n player,\n template: { $player },\n } = this.art;\n this.animationFrameTimer = window.requestAnimationFrame(() => {\n if (player.playing) {\n this.queue\n .filter(danmu => {\n return (\n player.currentTime + 0.1 >= danmu.time &&\n danmu.time >= player.currentTime - 0.1 &&\n danmu.$state === 'wait'\n );\n })\n .forEach(danmu => {\n danmu.$state = 'emit';\n danmu.$ref = this.getDanmuRef();\n danmu.$ref.style.opacity = this.option.opacity;\n danmu.$ref.style.fontSize = `${this.option.fontSize}px`;\n danmu.$ref.innerText = danmu.text;\n danmu.$ref.style.color = danmu.color;\n danmu.$ref.style.border = danmu.border ? `1px solid ${danmu.color}` : 'none';\n danmu.$restTime = this.option.speed;\n danmu.$lastStartTime = Date.now();\n const danmuWidth = getRect(danmu.$ref, 'width');\n const danmuTop = this.getDanmuTop(danmu.mode);\n switch (danmu.mode) {\n case 'scroll': {\n const danmuLeft = getRect($player, 'width');\n danmu.$restWidth = danmuLeft + danmuWidth + 5;\n danmu.$ref.style.left = `${danmuLeft}px`;\n danmu.$ref.style.top = `${danmuTop}px`;\n danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`;\n danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`;\n break;\n }\n case 'static':\n danmu.$ref.style.top = `${danmuTop}px`;\n danmu.$ref.style.left = '50%';\n danmu.$ref.style.marginLeft = `-${danmuWidth / 2}px`;\n break;\n default:\n break;\n }\n });\n }\n\n if (!this.isStop) {\n this.update();\n }\n });\n }\n\n stop() {\n this.isStop = true;\n this.suspend();\n window.cancelAnimationFrame(this.animationFrameTimer);\n this.art.emit('artplayerPluginDanmuku:stop');\n }\n\n start() {\n this.isStop = false;\n this.continue();\n this.update();\n this.art.emit('artplayerPluginDanmuku:start');\n }\n\n show() {\n this.$danmuku.style = 'block';\n this.art.emit('artplayerPluginDanmuku:show');\n }\n\n hide() {\n this.$danmuku.style = 'none';\n this.art.emit('artplayerPluginDanmuku:hide');\n }\n\n emit(danmu) {\n const { notice, player, i18n } = this.art;\n if (!danmu.text.trim()) {\n notice.show(i18n.get('Danmu text cannot be empty'));\n return;\n }\n\n if (danmu.text.length > this.option.maxlength) {\n notice.show(`${i18n.get('The length of the danmu does not exceed')} ${this.option.maxlength}`);\n return;\n }\n\n if (typeof danmu.time !== 'number') {\n danmu.time = player.currentTime;\n }\n\n this.queue.push({\n ...danmu,\n $state: 'wait',\n $ref: null,\n $restTime: 0,\n $lastStartTime: 0,\n $restWidth: 0,\n });\n }\n}\n","import Danmuku from './danmuku';\n\nexport default function artplayerPluginDanmuku(option) {\n return art => {\n const danmuku = new Danmuku(art, option);\n return {\n name: 'artplayerPluginDanmuku',\n emit: danmuku.emit.bind(danmuku),\n config: danmuku.config.bind(danmuku),\n start: danmuku.start.bind(danmuku),\n stop: danmuku.stop.bind(danmuku),\n hide: danmuku.hide.bind(danmuku),\n show: danmuku.show.bind(danmuku),\n };\n };\n}"],"names":["opacity","art","i18n","proxy","events","name","index","html","get","mounted","$setting","$range","querySelector","$value","value","innerText","Number","plugins","artplayerPluginDanmuku","config","on","size","fontSize","speed","filter","queue","state","callback","danmu","$state","map","getRect","ref","key","result","getBoundingClientRect","getMode","bilibiliDanmuParseFromXml","xmlString","srtList","match","length","item","attrStr","text","attr","split","trim","time","mode","color","toString","timestamp","pool","userID","rowID","bilibiliDanmuParseFromUrl","url","fetch","then","res","getDanmuTopByDiff","danmus","top","maxDiff","prev","prevTop","height","diff","getDanmuTopBySparse","topMap","push","maxRight","topMapKeys","Object","keys","minRight","width","topKey","danmuArr","right","randomKey","Math","floor","random","getDanmuTop","Danmuku","option","update","setting","add","refs","isStop","animationFrameTimer","$danmuku","template","start","bind","stop","danmuku","forEach","emit","constructor","clamp","utils","validator","assign","scheme","maxlength","margin","$lastStartTime","Date","now","$ref","style","transform","$restWidth","transition","$restTime","$player","playerLeft","left","playerWidth","danmuLeft","translateX","setStyles","append","waitDanmu","find","danmuWidth","border","appendChild","document","createElement","userSelect","position","whiteSpace","pointerEvents","perspective","display","willChange","fontFamily","fontWeight","lineHeight","textShadow","playerTop","playerHeight","danmusBySort","danmuTop","danmuHeight","sort","next","unshift","player","window","requestAnimationFrame","playing","currentTime","getDanmuRef","marginLeft","suspend","cancelAnimationFrame","notice","show","hide"],"mappings":"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"} \ No newline at end of file diff --git a/packages/artplayer-plugin-danmuku/src/bilibiliDanmuParse.js b/packages/artplayer-plugin-danmuku/src/bilibili.js similarity index 84% rename from packages/artplayer-plugin-danmuku/src/bilibiliDanmuParse.js rename to packages/artplayer-plugin-danmuku/src/bilibili.js index c1955b82f..171869826 100644 --- a/packages/artplayer-plugin-danmuku/src/bilibiliDanmuParse.js +++ b/packages/artplayer-plugin-danmuku/src/bilibili.js @@ -1,3 +1,17 @@ +export function getMode(key) { + switch (key) { + case 1: + case 2: + case 3: + return 'scroll'; + case 4: + case 5: + return 'static'; + default: + return null; + } +} + export function bilibiliDanmuParseFromXml(xmlString) { if (typeof xmlString !== 'string') return []; const srtList = xmlString.match(/[\S ]*?)<\/d>/gi); @@ -9,7 +23,7 @@ export function bilibiliDanmuParseFromXml(xmlString) { ? { text, time: Number(attr[0]), - mode: Number(attr[1]), + mode: getMode(Number(attr[1])), fontSize: Number(attr[2]), color: `#${Number(attr[3]).toString(16)}`, timestamp: Number(attr[4]), diff --git a/packages/artplayer-plugin-danmuku/src/danmuku.js b/packages/artplayer-plugin-danmuku/src/danmuku.js index 2ddf041b6..0fabe811a 100644 --- a/packages/artplayer-plugin-danmuku/src/danmuku.js +++ b/packages/artplayer-plugin-danmuku/src/danmuku.js @@ -1,8 +1,15 @@ -import { bilibiliDanmuParseFromUrl } from './bilibiliDanmuParse'; +import i18n from './i18n'; +import { opacity, size, speed } from './setting'; +import { filter, getRect } from './utils'; +import { bilibiliDanmuParseFromUrl } from './bilibili'; import getDanmuTop from './getDanmuTop'; export default class Danmuku { constructor(art, option) { + art.i18n.update(i18n); + art.setting.add(opacity); + art.setting.add(size); + art.setting.add(speed); this.art = art; this.queue = []; this.refs = []; @@ -11,42 +18,27 @@ export default class Danmuku { this.isStop = false; this.animationFrameTimer = null; this.$danmuku = art.template.$danmuku; - art.i18n.update(Danmuku.i18n); art.on('video:play', this.start.bind(this)); art.on('video:playing', this.start.bind(this)); art.on('video:pause', this.stop.bind(this)); art.on('video:waiting', this.stop.bind(this)); - art.on('resize', this.resize.bind(this)); art.on('destroy', this.stop.bind(this)); if (typeof this.option.danmuku === 'function') { this.option.danmuku().then(danmus => { - danmus.forEach(this.addToQueue.bind(this)); + danmus.forEach(this.emit.bind(this)); art.emit('artplayerPluginDanmuku:loaded'); }); } else if (typeof this.option.danmuku === 'string') { bilibiliDanmuParseFromUrl(this.option.danmuku).then(danmus => { - danmus.forEach(this.addToQueue.bind(this)); + danmus.forEach(this.emit.bind(this)); art.emit('artplayerPluginDanmuku:loaded'); }); } else { - this.option.danmuku.forEach(this.addToQueue.bind(this)); + this.option.danmuku.forEach(this.emit.bind(this)); art.emit('artplayerPluginDanmuku:loaded'); } } - static get i18n() { - return { - 'zh-cn': { - 'Danmu text cannot be empty': '弹幕文本不能为空', - 'The length of the danmu does not exceed': '弹幕文本字数不能超过', - }, - 'zh-tw': { - 'Danmu text cannot be empty': '彈幕文本不能為空', - 'The length of the danmu does not exceed': '彈幕文本字數不能超過', - }, - }; - } - static get option() { return { danmuku: [], @@ -69,11 +61,6 @@ export default class Danmuku { }; } - static getRect(ref, key) { - const result = ref.getBoundingClientRect(); - return key ? result[key] : result; - } - config(option) { const { utils: { clamp }, @@ -90,99 +77,54 @@ export default class Danmuku { this.art.emit('artplayerPluginDanmuku:config', this.option); } - emit(danmu) { - const { $player } = this.art.template; - danmu.$ref = this.getDanmuRef(); - danmu.$ref.style.opacity = this.option.opacity; - danmu.$ref.style.fontSize = `${this.option.fontSize}px`; - danmu.$ref.innerText = danmu.text; - danmu.$ref.style.color = danmu.color; - const playerWidth = Danmuku.getRect($player, 'width'); - const danmuWidth = Danmuku.getRect(danmu.$ref, 'width'); - danmu.$restWidth = playerWidth + danmuWidth + 5; - danmu.$restTime = this.option.speed; - danmu.$lastStartTime = Date.now(); - danmu.$ref.style.left = `${playerWidth}px`; - danmu.$ref.style.top = `${this.getDanmuTop()}px`; - danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`; - danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`; - if (danmu.border) { - danmu.$ref.style.border = `1px solid ${danmu.border}`; - } - danmu.$state = 'emit'; - } - - static continue(danmu) { - danmu.$lastStartTime = Date.now(); - danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`; - danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`; - danmu.$state = 'emit'; - } - - resize() { - const { $player } = this.art.template; - const { width: playerWidth } = Danmuku.getRect($player); - this.queue.forEach(danmu => { - danmu.$state = 'wait'; - }); - this.refs.forEach($ref => { - $ref.style.left = `${playerWidth}px`; - $ref.style.border = 'none'; - $ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)'; - $ref.style.transition = 'transform 0s linear 0s'; + continue() { + filter(this.queue, 'stop', danmu => { + danmu.$state = 'emit'; + danmu.$lastStartTime = Date.now(); + switch (danmu.mode) { + case 'scroll': + danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`; + danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`; + break; + default: + break; + } }); } - suspend(danmu) { + suspend() { const { $player } = this.art.template; - const { left: playerLeft, width: playerWidth } = Danmuku.getRect($player); - const { left: danmuLeft } = Danmuku.getRect(danmu.$ref); - danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000; - const translateX = playerWidth - (danmuLeft - playerLeft) + 5; - danmu.$ref.style.transform = `translateX(${-translateX}px) translateY(0px) translateZ(0px)`; - danmu.$ref.style.transition = 'transform 0s linear 0s'; - danmu.$state = 'stop'; - } - - addToQueue(danmu) { - const { notice, player, i18n } = this.art; - if (!danmu.text.trim()) { - notice.show(i18n.get('Danmu text cannot be empty')); - return; - } - - if (danmu.text.length > this.option.maxlength) { - notice.show(`${i18n.get('The length of the danmu does not exceed')} ${this.option.maxlength}`); - return; - } - - if (typeof danmu.time !== 'number') { - danmu.time = player.currentTime; - } - - this.queue.push({ - ...danmu, - $state: 'wait', - $ref: null, - $restTime: 0, - $lastStartTime: 0, + const { left: playerLeft, width: playerWidth } = getRect($player); + filter(this.queue, 'emit', danmu => { + danmu.$state = 'stop'; + const { left: danmuLeft } = getRect(danmu.$ref); + danmu.$restTime -= (Date.now() - danmu.$lastStartTime) / 1000; + const translateX = playerWidth - (danmuLeft - playerLeft) + 5; + switch (danmu.mode) { + case 'scroll': + danmu.$ref.style.transform = `translateX(${-translateX}px) translateY(0px) translateZ(0px)`; + danmu.$ref.style.transition = 'transform 0s linear 0s'; + break; + default: + break; + } }); } getDanmuRef() { const { $player } = this.art.template; const { setStyles, append } = this.art.constructor.utils; - const playerLeft = Danmuku.getRect($player, 'left'); + const playerLeft = getRect($player, 'left'); const waitDanmu = this.queue.find(danmu => { if (danmu.$ref) { - const { left: danmuLeft, width: danmuWidth } = Danmuku.getRect(danmu.$ref); - return danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth; + const { left: danmuLeft, width: danmuWidth } = getRect(danmu.$ref); + return danmu.$state === 'wait' || (danmu.$state === 'emit' && playerLeft > danmuLeft + danmuWidth); } return false; }); - if (waitDanmu) { + if (waitDanmu && waitDanmu.$state === 'emit') { waitDanmu.$state = 'wait'; waitDanmu.$ref.style.border = 'none'; waitDanmu.$ref.style.transform = 'translateX(0px) translateY(0px) translateZ(0px)'; @@ -215,7 +157,7 @@ export default class Danmuku { getDanmuTop() { const { $player } = this.art.template; - const { left: playerLeft, top: playerTop, height: playerHeight, width: playerWidth } = Danmuku.getRect($player); + const { left: playerLeft, top: playerTop, height: playerHeight, width: playerWidth } = getRect($player); const danmus = this.queue.filter(danmu => danmu.$state === 'emit'); if (danmus.length === 0) { @@ -224,9 +166,7 @@ export default class Danmuku { const danmusBySort = danmus .map(danmu => { - const { left: danmuLeft, top: danmuTop, width: danmuWidth, height: danmuHeight } = Danmuku.getRect( - danmu.$ref, - ); + const { left: danmuLeft, top: danmuTop, width: danmuWidth, height: danmuHeight } = getRect(danmu.$ref); const top = danmuTop - playerTop; const left = danmuLeft - playerLeft; const right = playerWidth - left - danmuWidth; @@ -262,7 +202,10 @@ export default class Danmuku { } update() { - const { player } = this.art; + const { + player, + template: { $player }, + } = this.art; this.animationFrameTimer = window.requestAnimationFrame(() => { if (player.playing) { this.queue @@ -274,7 +217,35 @@ export default class Danmuku { ); }) .forEach(danmu => { - this.emit(danmu); + danmu.$state = 'emit'; + danmu.$ref = this.getDanmuRef(); + danmu.$ref.style.opacity = this.option.opacity; + danmu.$ref.style.fontSize = `${this.option.fontSize}px`; + danmu.$ref.innerText = danmu.text; + danmu.$ref.style.color = danmu.color; + danmu.$ref.style.border = danmu.border ? `1px solid ${danmu.color}` : 'none'; + danmu.$restTime = this.option.speed; + danmu.$lastStartTime = Date.now(); + const danmuWidth = getRect(danmu.$ref, 'width'); + const danmuTop = this.getDanmuTop(danmu.mode); + switch (danmu.mode) { + case 'scroll': { + const danmuLeft = getRect($player, 'width'); + danmu.$restWidth = danmuLeft + danmuWidth + 5; + danmu.$ref.style.left = `${danmuLeft}px`; + danmu.$ref.style.top = `${danmuTop}px`; + danmu.$ref.style.transform = `translateX(${-danmu.$restWidth}px) translateY(0px) translateZ(0px)`; + danmu.$ref.style.transition = `transform ${danmu.$restTime}s linear 0s`; + break; + } + case 'static': + danmu.$ref.style.top = `${danmuTop}px`; + danmu.$ref.style.left = '50%'; + danmu.$ref.style.marginLeft = `-${danmuWidth / 2}px`; + break; + default: + break; + } }); } @@ -286,22 +257,14 @@ export default class Danmuku { stop() { this.isStop = true; - this.queue - .filter(danmu => danmu.$state === 'emit') - .forEach(danmu => { - this.suspend(danmu); - }); + this.suspend(); window.cancelAnimationFrame(this.animationFrameTimer); this.art.emit('artplayerPluginDanmuku:stop'); } start() { this.isStop = false; - this.queue - .filter(danmu => danmu.$state === 'stop') - .forEach(danmu => { - Danmuku.continue(danmu); - }); + this.continue(); this.update(); this.art.emit('artplayerPluginDanmuku:start'); } @@ -315,4 +278,30 @@ export default class Danmuku { this.$danmuku.style = 'none'; this.art.emit('artplayerPluginDanmuku:hide'); } + + emit(danmu) { + const { notice, player, i18n } = this.art; + if (!danmu.text.trim()) { + notice.show(i18n.get('Danmu text cannot be empty')); + return; + } + + if (danmu.text.length > this.option.maxlength) { + notice.show(`${i18n.get('The length of the danmu does not exceed')} ${this.option.maxlength}`); + return; + } + + if (typeof danmu.time !== 'number') { + danmu.time = player.currentTime; + } + + this.queue.push({ + ...danmu, + $state: 'wait', + $ref: null, + $restTime: 0, + $lastStartTime: 0, + $restWidth: 0, + }); + } } diff --git a/packages/artplayer-plugin-danmuku/src/effect/index.js b/packages/artplayer-plugin-danmuku/src/effect/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/artplayer-plugin-danmuku/src/effect/scroll.js b/packages/artplayer-plugin-danmuku/src/effect/scroll.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/artplayer-plugin-danmuku/src/effect/static.js b/packages/artplayer-plugin-danmuku/src/effect/static.js new file mode 100644 index 000000000..e69de29bb diff --git a/packages/artplayer-plugin-danmuku/src/i18n.js b/packages/artplayer-plugin-danmuku/src/i18n.js index 28c6a0456..b96e2a042 100644 --- a/packages/artplayer-plugin-danmuku/src/i18n.js +++ b/packages/artplayer-plugin-danmuku/src/i18n.js @@ -3,10 +3,14 @@ export default { 'Danmu opacity': '弹幕透明度', 'Danmu speed': '弹幕速度', 'Danmu size': '弹幕大小', + 'Danmu text cannot be empty': '弹幕文本不能为空', + 'The length of the danmu does not exceed': '弹幕文本字数不能超过', }, 'zh-tw': { 'Danmu opacity': '彈幕透明度', 'Danmu speed': '彈幕速度', 'Danmu size': '弹幕大小', + 'Danmu text cannot be empty': '彈幕文本不能為空', + 'The length of the danmu does not exceed': '彈幕文本字數不能超過', }, }; \ No newline at end of file diff --git a/packages/artplayer-plugin-danmuku/src/index.js b/packages/artplayer-plugin-danmuku/src/index.js index d446b228a..6c5948b74 100644 --- a/packages/artplayer-plugin-danmuku/src/index.js +++ b/packages/artplayer-plugin-danmuku/src/index.js @@ -1,20 +1,11 @@ -import * as bilibili from './bilibiliDanmuParse'; import Danmuku from './danmuku'; -import i18n from './i18n'; -import settingOpacity from './settingOpacity'; -import settingSpeed from './settingSpeed'; -import settingSize from './settingSize'; -function artplayerPluginDanmuku(option) { +export default function artplayerPluginDanmuku(option) { return art => { const danmuku = new Danmuku(art, option); - art.i18n.update(i18n); - art.setting.add(settingOpacity); - art.setting.add(settingSpeed); - art.setting.add(settingSize); return { name: 'artplayerPluginDanmuku', - emit: danmuku.addToQueue.bind(danmuku), + emit: danmuku.emit.bind(danmuku), config: danmuku.config.bind(danmuku), start: danmuku.start.bind(danmuku), stop: danmuku.stop.bind(danmuku), @@ -22,7 +13,4 @@ function artplayerPluginDanmuku(option) { show: danmuku.show.bind(danmuku), }; }; -} - -artplayerPluginDanmuku.bilibili = bilibili; -export default artplayerPluginDanmuku; +} \ No newline at end of file diff --git a/packages/artplayer-plugin-danmuku/src/setting.js b/packages/artplayer-plugin-danmuku/src/setting.js new file mode 100644 index 000000000..1e1f53b45 --- /dev/null +++ b/packages/artplayer-plugin-danmuku/src/setting.js @@ -0,0 +1,116 @@ +export function opacity(art) { + const { + i18n, + events: { proxy }, + } = art; + + return { + name: 'danmuku-opacity', + index: 30, + html: ` +
+ ${i18n.get('Danmu opacity')}: 100% +
+
+ +
+ `, + mounted: $setting => { + const $range = $setting.querySelector('input[type=range]'); + const $value = $setting.querySelector('.art-value'); + proxy($range, 'change', () => { + const { value } = $range; + $value.innerText = Number(value) * 100; + + art.plugins.artplayerPluginDanmuku.config({ + opacity: Number(value), + }); + + art.on('artplayerPluginDanmuku:config', config => { + if ($range.value !== config.opacity) { + $range.value = config.opacity; + $value.innerText = config.opacity * 100; + } + }); + }); + }, + }; +} + +export function size(art) { + const { + i18n, + events: { proxy }, + } = art; + + return { + name: 'danmuku-size', + index: 50, + html: ` +
+ ${i18n.get('Danmu size')}: 25px +
+
+ +
+ `, + mounted: $setting => { + const $range = $setting.querySelector('input[type=range]'); + const $value = $setting.querySelector('.art-value'); + proxy($range, 'change', () => { + const { value } = $range; + $value.innerText = value; + + art.plugins.artplayerPluginDanmuku.config({ + fontSize: Number(value), + }); + + art.on('artplayerPluginDanmuku:config', config => { + if ($range.value !== config.fontSize) { + $range.value = config.fontSize; + $value.innerText = config.fontSize; + } + }); + }); + }, + }; +} + +export function speed(art) { + const { + i18n, + events: { proxy }, + } = art; + + return { + name: 'danmuku-speed', + index: 40, + html: ` +
+ ${i18n.get('Danmu speed')}: 5s +
+
+ +
+ `, + mounted: $setting => { + const $range = $setting.querySelector('input[type=range]'); + const $value = $setting.querySelector('.art-value'); + proxy($range, 'change', () => { + const { value } = $range; + $value.innerText = value; + + art.plugins.artplayerPluginDanmuku.config({ + speed: Number(value), + }); + + art.on('artplayerPluginDanmuku:config', config => { + if ($range.value !== config.speed) { + $range.value = config.speed; + $value.innerText = config.speed; + } + }); + }); + }, + }; +} diff --git a/packages/artplayer-plugin-danmuku/src/settingOpacity.js b/packages/artplayer-plugin-danmuku/src/settingOpacity.js deleted file mode 100644 index 750b82212..000000000 --- a/packages/artplayer-plugin-danmuku/src/settingOpacity.js +++ /dev/null @@ -1,38 +0,0 @@ -export default function setting(art) { - const { - i18n, - events: { proxy }, - } = art; - - return { - name: 'danmuku-opacity', - index: 30, - html: ` -
- ${i18n.get('Danmu opacity')}: 100% -
-
- -
- `, - mounted: $setting => { - const $range = $setting.querySelector('input[type=range]'); - const $value = $setting.querySelector('.art-value'); - proxy($range, 'change', () => { - const { value } = $range; - $value.innerText = Number(value) * 100; - - art.plugins.artplayerPluginDanmuku.config({ - opacity: Number(value), - }); - - art.on('artplayerPluginDanmuku:config', config => { - if ($range.value !== config.opacity) { - $range.value = config.opacity; - $value.innerText = config.opacity * 100; - } - }); - }); - }, - }; -} diff --git a/packages/artplayer-plugin-danmuku/src/settingSize.js b/packages/artplayer-plugin-danmuku/src/settingSize.js deleted file mode 100644 index 182378f7e..000000000 --- a/packages/artplayer-plugin-danmuku/src/settingSize.js +++ /dev/null @@ -1,38 +0,0 @@ -export default function setting(art) { - const { - i18n, - events: { proxy }, - } = art; - - return { - name: 'danmuku-size', - index: 50, - html: ` -
- ${i18n.get('Danmu size')}: 25px -
-
- -
- `, - mounted: $setting => { - const $range = $setting.querySelector('input[type=range]'); - const $value = $setting.querySelector('.art-value'); - proxy($range, 'change', () => { - const { value } = $range; - $value.innerText = value; - - art.plugins.artplayerPluginDanmuku.config({ - fontSize: Number(value), - }); - - art.on('artplayerPluginDanmuku:config', config => { - if ($range.value !== config.fontSize) { - $range.value = config.fontSize; - $value.innerText = config.fontSize; - } - }); - }); - }, - }; -} diff --git a/packages/artplayer-plugin-danmuku/src/settingSpeed.js b/packages/artplayer-plugin-danmuku/src/settingSpeed.js deleted file mode 100644 index aa97c7bf1..000000000 --- a/packages/artplayer-plugin-danmuku/src/settingSpeed.js +++ /dev/null @@ -1,38 +0,0 @@ -export default function setting(art) { - const { - i18n, - events: { proxy }, - } = art; - - return { - name: 'danmuku-speed', - index: 40, - html: ` -
- ${i18n.get('Danmu speed')}: 5s -
-
- -
- `, - mounted: $setting => { - const $range = $setting.querySelector('input[type=range]'); - const $value = $setting.querySelector('.art-value'); - proxy($range, 'change', () => { - const { value } = $range; - $value.innerText = value; - - art.plugins.artplayerPluginDanmuku.config({ - speed: Number(value), - }); - - art.on('artplayerPluginDanmuku:config', config => { - if ($range.value !== config.speed) { - $range.value = config.speed; - $value.innerText = config.speed; - } - }); - }); - }, - }; -} diff --git a/packages/artplayer-plugin-danmuku/src/utils.js b/packages/artplayer-plugin-danmuku/src/utils.js new file mode 100644 index 000000000..197670711 --- /dev/null +++ b/packages/artplayer-plugin-danmuku/src/utils.js @@ -0,0 +1,8 @@ +export function filter(queue, state, callback) { + return queue.filter(danmu => danmu.$state === state).map(callback); +} + +export function getRect(ref, key) { + const result = ref.getBoundingClientRect(); + return key ? result[key] : result; +} \ No newline at end of file