UNPKG

vue-files-preview-inno

Version:

A tool for previewing files such as doc, excel, pdf, image, markdown, txt, audio, and video and so on.

1 lines 33.3 kB
{"version":3,"file":"core.mjs","sources":["../../../../../../node_modules/epubjs/src/utils/core.js"],"sourcesContent":["/**\n * Core Utilities and Helpers\n * @module Core\n*/\nimport { DOMParser as XMLDOMParser } from \"@xmldom/xmldom\";\n\n/**\n * Vendor prefixed requestAnimationFrame\n * @returns {function} requestAnimationFrame\n * @memberof Core\n */\nexport const requestAnimationFrame = (typeof window != \"undefined\") ? (window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame) : false;\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\nconst COMMENT_NODE = 8;\nconst DOCUMENT_NODE = 9;\nconst _URL = typeof URL != \"undefined\" ? URL : (typeof window != \"undefined\" ? (window.URL || window.webkitURL || window.mozURL) : undefined);\n\n/**\n * Generates a UUID\n * based on: http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript\n * @returns {string} uuid\n * @memberof Core\n */\nexport function uuid() {\n\tvar d = new Date().getTime();\n\tvar uuid = \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function(c) {\n\t\tvar r = (d + Math.random()*16)%16 | 0;\n\t\td = Math.floor(d/16);\n\t\treturn (c==\"x\" ? r : (r&0x7|0x8)).toString(16);\n\t});\n\treturn uuid;\n}\n\n/**\n * Gets the height of a document\n * @returns {number} height\n * @memberof Core\n */\nexport function documentHeight() {\n\treturn Math.max(\n\t\t\tdocument.documentElement.clientHeight,\n\t\t\tdocument.body.scrollHeight,\n\t\t\tdocument.documentElement.scrollHeight,\n\t\t\tdocument.body.offsetHeight,\n\t\t\tdocument.documentElement.offsetHeight\n\t);\n}\n\n/**\n * Checks if a node is an element\n * @param {object} obj\n * @returns {boolean}\n * @memberof Core\n */\nexport function isElement(obj) {\n\treturn !!(obj && obj.nodeType == 1);\n}\n\n/**\n * @param {any} n\n * @returns {boolean}\n * @memberof Core\n */\nexport function isNumber(n) {\n\treturn !isNaN(parseFloat(n)) && isFinite(n);\n}\n\n/**\n * @param {any} n\n * @returns {boolean}\n * @memberof Core\n */\nexport function isFloat(n) {\n\tlet f = parseFloat(n);\n\n\tif (isNumber(n) === false) {\n\t\treturn false;\n\t}\n\n\tif (typeof n === \"string\" && n.indexOf(\".\") > -1) {\n\t\treturn true;\n\t}\n\n\treturn Math.floor(f) !== f;\n}\n\n/**\n * Get a prefixed css property\n * @param {string} unprefixed\n * @returns {string}\n * @memberof Core\n */\nexport function prefixed(unprefixed) {\n\tvar vendors = [\"Webkit\", \"webkit\", \"Moz\", \"O\", \"ms\" ];\n\tvar prefixes = [\"-webkit-\", \"-webkit-\", \"-moz-\", \"-o-\", \"-ms-\"];\n\tvar lower = unprefixed.toLowerCase();\n\tvar length = vendors.length;\n\n\tif (typeof(document) === \"undefined\" || typeof(document.body.style[lower]) != \"undefined\") {\n\t\treturn unprefixed;\n\t}\n\n\tfor (var i = 0; i < length; i++) {\n\t\tif (typeof(document.body.style[prefixes[i] + lower]) != \"undefined\") {\n\t\t\treturn prefixes[i] + lower;\n\t\t}\n\t}\n\n\treturn unprefixed;\n}\n\n/**\n * Apply defaults to an object\n * @param {object} obj\n * @returns {object}\n * @memberof Core\n */\nexport function defaults(obj) {\n\tfor (var i = 1, length = arguments.length; i < length; i++) {\n\t\tvar source = arguments[i];\n\t\tfor (var prop in source) {\n\t\t\tif (obj[prop] === void 0) obj[prop] = source[prop];\n\t\t}\n\t}\n\treturn obj;\n}\n\n/**\n * Extend properties of an object\n * @param {object} target\n * @returns {object}\n * @memberof Core\n */\nexport function extend(target) {\n\tvar sources = [].slice.call(arguments, 1);\n\tsources.forEach(function (source) {\n\t\tif(!source) return;\n\t\tObject.getOwnPropertyNames(source).forEach(function(propName) {\n\t\t\tObject.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName));\n\t\t});\n\t});\n\treturn target;\n}\n\n/**\n * Fast quicksort insert for sorted array -- based on:\n * http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @returns {number} location (in array)\n * @memberof Core\n */\nexport function insert(item, array, compareFunction) {\n\tvar location = locationOf(item, array, compareFunction);\n\tarray.splice(location, 0, item);\n\n\treturn location;\n}\n\n/**\n * Finds where something would fit into a sorted array\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @param {function} [_start]\n * @param {function} [_end]\n * @returns {number} location (in array)\n * @memberof Core\n */\nexport function locationOf(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a == b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn pivot;\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared >= 0 ? pivot : pivot + 1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot;\n\t}\n\tif(compared === -1) {\n\t\treturn locationOf(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn locationOf(item, array, compareFunction, start, pivot);\n\t}\n}\n\n/**\n * Finds index of something in a sorted array\n * Returns -1 if not found\n * @param {any} item\n * @param {array} array\n * @param {function} [compareFunction]\n * @param {function} [_start]\n * @param {function} [_end]\n * @returns {number} index (in array) or -1\n * @memberof Core\n */\nexport function indexOfSorted(item, array, compareFunction, _start, _end) {\n\tvar start = _start || 0;\n\tvar end = _end || array.length;\n\tvar pivot = parseInt(start + (end - start) / 2);\n\tvar compared;\n\tif(!compareFunction){\n\t\tcompareFunction = function(a, b) {\n\t\t\tif(a > b) return 1;\n\t\t\tif(a < b) return -1;\n\t\t\tif(a == b) return 0;\n\t\t};\n\t}\n\tif(end-start <= 0) {\n\t\treturn -1; // Not found\n\t}\n\n\tcompared = compareFunction(array[pivot], item);\n\tif(end-start === 1) {\n\t\treturn compared === 0 ? pivot : -1;\n\t}\n\tif(compared === 0) {\n\t\treturn pivot; // Found\n\t}\n\tif(compared === -1) {\n\t\treturn indexOfSorted(item, array, compareFunction, pivot, end);\n\t} else{\n\t\treturn indexOfSorted(item, array, compareFunction, start, pivot);\n\t}\n}\n/**\n * Find the bounds of an element\n * taking padding and margin into account\n * @param {element} el\n * @returns {{ width: Number, height: Number}}\n * @memberof Core\n */\nexport function bounds(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"width\", \"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"height\", \"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n}\n\n/**\n * Find the bounds of an element\n * taking padding, margin and borders into account\n * @param {element} el\n * @returns {{ width: Number, height: Number}}\n * @memberof Core\n */\nexport function borders(el) {\n\n\tvar style = window.getComputedStyle(el);\n\tvar widthProps = [\"paddingRight\", \"paddingLeft\", \"marginRight\", \"marginLeft\", \"borderRightWidth\", \"borderLeftWidth\"];\n\tvar heightProps = [\"paddingTop\", \"paddingBottom\", \"marginTop\", \"marginBottom\", \"borderTopWidth\", \"borderBottomWidth\"];\n\n\tvar width = 0;\n\tvar height = 0;\n\n\twidthProps.forEach(function(prop){\n\t\twidth += parseFloat(style[prop]) || 0;\n\t});\n\n\theightProps.forEach(function(prop){\n\t\theight += parseFloat(style[prop]) || 0;\n\t});\n\n\treturn {\n\t\theight: height,\n\t\twidth: width\n\t};\n\n}\n\n/**\n * Find the bounds of any node\n * allows for getting bounds of text nodes by wrapping them in a range\n * @param {node} node\n * @returns {BoundingClientRect}\n * @memberof Core\n */\nexport function nodeBounds(node) {\n\tlet elPos;\n\tlet doc = node.ownerDocument;\n\tif(node.nodeType == Node.TEXT_NODE){\n\t\tlet elRange = doc.createRange();\n\t\telRange.selectNodeContents(node);\n\t\telPos = elRange.getBoundingClientRect();\n\t} else {\n\t\telPos = node.getBoundingClientRect();\n\t}\n\treturn elPos;\n}\n\n/**\n * Find the equivalent of getBoundingClientRect of a browser window\n * @returns {{ width: Number, height: Number, top: Number, left: Number, right: Number, bottom: Number }}\n * @memberof Core\n */\nexport function windowBounds() {\n\n\tvar width = window.innerWidth;\n\tvar height = window.innerHeight;\n\n\treturn {\n\t\ttop: 0,\n\t\tleft: 0,\n\t\tright: width,\n\t\tbottom: height,\n\t\twidth: width,\n\t\theight: height\n\t};\n\n}\n\n/**\n * Gets the index of a node in its parent\n * @param {Node} node\n * @param {string} typeId\n * @return {number} index\n * @memberof Core\n */\nexport function indexOfNode(node, typeId) {\n\tvar parent = node.parentNode;\n\tvar children = parent.childNodes;\n\tvar sib;\n\tvar index = -1;\n\tfor (var i = 0; i < children.length; i++) {\n\t\tsib = children[i];\n\t\tif (sib.nodeType === typeId) {\n\t\t\tindex++;\n\t\t}\n\t\tif (sib == node) break;\n\t}\n\n\treturn index;\n}\n\n/**\n * Gets the index of a text node in its parent\n * @param {node} textNode\n * @returns {number} index\n * @memberof Core\n */\nexport function indexOfTextNode(textNode) {\n\treturn indexOfNode(textNode, TEXT_NODE);\n}\n\n/**\n * Gets the index of an element node in its parent\n * @param {element} elementNode\n * @returns {number} index\n * @memberof Core\n */\nexport function indexOfElementNode(elementNode) {\n\treturn indexOfNode(elementNode, ELEMENT_NODE);\n}\n\n/**\n * Check if extension is xml\n * @param {string} ext\n * @returns {boolean}\n * @memberof Core\n */\nexport function isXml(ext) {\n\treturn [\"xml\", \"opf\", \"ncx\"].indexOf(ext) > -1;\n}\n\n/**\n * Create a new blob\n * @param {any} content\n * @param {string} mime\n * @returns {Blob}\n * @memberof Core\n */\nexport function createBlob(content, mime){\n\treturn new Blob([content], {type : mime });\n}\n\n/**\n * Create a new blob url\n * @param {any} content\n * @param {string} mime\n * @returns {string} url\n * @memberof Core\n */\nexport function createBlobUrl(content, mime){\n\tvar tempUrl;\n\tvar blob = createBlob(content, mime);\n\n\ttempUrl = _URL.createObjectURL(blob);\n\n\treturn tempUrl;\n}\n\n/**\n * Remove a blob url\n * @param {string} url\n * @memberof Core\n */\nexport function revokeBlobUrl(url){\n\treturn _URL.revokeObjectURL(url);\n}\n\n/**\n * Create a new base64 encoded url\n * @param {any} content\n * @param {string} mime\n * @returns {string} url\n * @memberof Core\n */\nexport function createBase64Url(content, mime){\n\tvar data;\n\tvar datauri;\n\n\tif (typeof(content) !== \"string\") {\n\t\t// Only handles strings\n\t\treturn;\n\t}\n\n\tdata = btoa(content);\n\n\tdatauri = \"data:\" + mime + \";base64,\" + data;\n\n\treturn datauri;\n}\n\n/**\n * Get type of an object\n * @param {object} obj\n * @returns {string} type\n * @memberof Core\n */\nexport function type(obj){\n\treturn Object.prototype.toString.call(obj).slice(8, -1);\n}\n\n/**\n * Parse xml (or html) markup\n * @param {string} markup\n * @param {string} mime\n * @param {boolean} forceXMLDom force using xmlDom to parse instead of native parser\n * @returns {document} document\n * @memberof Core\n */\nexport function parse(markup, mime, forceXMLDom) {\n\tvar doc;\n\tvar Parser;\n\n\tif (typeof DOMParser === \"undefined\" || forceXMLDom) {\n\t\tParser = XMLDOMParser;\n\t} else {\n\t\tParser = DOMParser;\n\t}\n\n\t// Remove byte order mark before parsing\n\t// https://www.w3.org/International/questions/qa-byte-order-mark\n\tif(markup.charCodeAt(0) === 0xFEFF) {\n\t\tmarkup = markup.slice(1);\n\t}\n\n\tdoc = new Parser().parseFromString(markup, mime);\n\n\treturn doc;\n}\n\n/**\n * querySelector polyfill\n * @param {element} el\n * @param {string} sel selector string\n * @returns {element} element\n * @memberof Core\n */\nexport function qs(el, sel) {\n\tvar elements;\n\tif (!el) {\n\t\tthrow new Error(\"No Element Provided\");\n\t}\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\telements = el.getElementsByTagName(sel);\n\t\tif (elements.length) {\n\t\t\treturn elements[0];\n\t\t}\n\t}\n}\n\n/**\n * querySelectorAll polyfill\n * @param {element} el\n * @param {string} sel selector string\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function qsa(el, sel) {\n\n\tif (typeof el.querySelector != \"undefined\") {\n\t\treturn el.querySelectorAll(sel);\n\t} else {\n\t\treturn el.getElementsByTagName(sel);\n\t}\n}\n\n/**\n * querySelector by property\n * @param {element} el\n * @param {string} sel selector string\n * @param {object[]} props\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function qsp(el, sel, props) {\n\tvar q, filtered;\n\tif (typeof el.querySelector != \"undefined\") {\n\t\tsel += \"[\";\n\t\tfor (var prop in props) {\n\t\t\tsel += prop + \"~='\" + props[prop] + \"'\";\n\t\t}\n\t\tsel += \"]\";\n\t\treturn el.querySelector(sel);\n\t} else {\n\t\tq = el.getElementsByTagName(sel);\n\t\tfiltered = Array.prototype.slice.call(q, 0).filter(function(el) {\n\t\t\tfor (var prop in props) {\n\t\t\t\tif(el.getAttribute(prop) === props[prop]){\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\n\t\tif (filtered) {\n\t\t\treturn filtered[0];\n\t\t}\n\t}\n}\n\n/**\n * Sprint through all text nodes in a document\n * @memberof Core\n * @param {element} root element to start with\n * @param {function} func function to run on each element\n */\nexport function sprint(root, func) {\n\tvar doc = root.ownerDocument || root;\n\tif (typeof(doc.createTreeWalker) !== \"undefined\") {\n\t\ttreeWalker(root, func, NodeFilter.SHOW_TEXT);\n\t} else {\n\t\twalk(root, function(node) {\n\t\t\tif (node && node.nodeType === 3) { // Node.TEXT_NODE\n\t\t\t\tfunc(node);\n\t\t\t}\n\t\t}, true);\n\t}\n}\n\n/**\n * Create a treeWalker\n * @memberof Core\n * @param {element} root element to start with\n * @param {function} func function to run on each element\n * @param {function | object} filter function or object to filter with\n */\nexport function treeWalker(root, func, filter) {\n\tvar treeWalker = document.createTreeWalker(root, filter, null, false);\n\tlet node;\n\twhile ((node = treeWalker.nextNode())) {\n\t\tfunc(node);\n\t}\n}\n\n/**\n * @memberof Core\n * @param {node} node\n * @param {callback} return false for continue,true for break inside callback\n */\nexport function walk(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tnode = node.firstChild;\n\tif(node){\n\t\tdo{\n\t\t\tlet walked = walk(node,callback);\n\t\t\tif(walked){\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tnode = node.nextSibling;\n\t\t} while(node);\n\t}\n}\n\n/**\n * Convert a blob to a base64 encoded string\n * @param {Blog} blob\n * @returns {string}\n * @memberof Core\n */\nexport function blob2base64(blob) {\n\treturn new Promise(function(resolve, reject) {\n\t\tvar reader = new FileReader();\n\t\treader.readAsDataURL(blob);\n\t\treader.onloadend = function() {\n\t\t\tresolve(reader.result);\n\t\t};\n\t});\n}\n\n\n/**\n * Creates a new pending promise and provides methods to resolve or reject it.\n * From: https://developer.mozilla.org/en-US/docs/Mozilla/JavaScript_code_modules/Promise.jsm/Deferred#backwards_forwards_compatible\n * @memberof Core\n */\nexport function defer() {\n\t/* A method to resolve the associated Promise with the value passed.\n\t * If the promise is already settled it does nothing.\n\t *\n\t * @param {anything} value : This value is used to resolve the promise\n\t * If the value is a Promise then the associated promise assumes the state\n\t * of Promise passed as value.\n\t */\n\tthis.resolve = null;\n\n\t/* A method to reject the associated Promise with the value passed.\n\t * If the promise is already settled it does nothing.\n\t *\n\t * @param {anything} reason: The reason for the rejection of the Promise.\n\t * Generally its an Error object. If however a Promise is passed, then the Promise\n\t * itself will be the reason for rejection no matter the state of the Promise.\n\t */\n\tthis.reject = null;\n\n\tthis.id = uuid();\n\n\t/* A newly created Pomise object.\n\t * Initially in pending state.\n\t */\n\tthis.promise = new Promise((resolve, reject) => {\n\t\tthis.resolve = resolve;\n\t\tthis.reject = reject;\n\t});\n\tObject.freeze(this);\n}\n\n/**\n * querySelector with filter by epub type\n * @param {element} html\n * @param {string} element element type to find\n * @param {string} type epub type to find\n * @returns {element[]} elements\n * @memberof Core\n */\nexport function querySelectorByType(html, element, type){\n\tvar query;\n\tif (typeof html.querySelector != \"undefined\") {\n\t\tquery = html.querySelector(`${element}[*|type=\"${type}\"]`);\n\t}\n\t// Handle IE not supporting namespaced epub:type in querySelector\n\tif(!query || query.length === 0) {\n\t\tquery = qsa(html, element);\n\t\tfor (var i = 0; i < query.length; i++) {\n\t\t\tif(query[i].getAttributeNS(\"http://www.idpf.org/2007/ops\", \"type\") === type ||\n\t\t\t\t query[i].getAttribute(\"epub:type\") === type) {\n\t\t\t\treturn query[i];\n\t\t\t}\n\t\t}\n\t} else {\n\t\treturn query;\n\t}\n}\n\n/**\n * Find direct descendents of an element\n * @param {element} el\n * @returns {element[]} children\n * @memberof Core\n */\nexport function findChildren(el) {\n\tvar result = [];\n\tvar childNodes = el.childNodes;\n\tfor (var i = 0; i < childNodes.length; i++) {\n\t\tlet node = childNodes[i];\n\t\tif (node.nodeType === 1) {\n\t\t\tresult.push(node);\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Find all parents (ancestors) of an element\n * @param {element} node\n * @returns {element[]} parents\n * @memberof Core\n */\nexport function parents(node) {\n\tvar nodes = [node];\n\tfor (; node; node = node.parentNode) {\n\t\tnodes.unshift(node);\n\t}\n\treturn nodes\n}\n\n/**\n * Find all direct descendents of a specific type\n * @param {element} el\n * @param {string} nodeName\n * @param {boolean} [single]\n * @returns {element[]} children\n * @memberof Core\n */\nexport function filterChildren(el, nodeName, single) {\n\tvar result = [];\n\tvar childNodes = el.childNodes;\n\tfor (var i = 0; i < childNodes.length; i++) {\n\t\tlet node = childNodes[i];\n\t\tif (node.nodeType === 1 && node.nodeName.toLowerCase() === nodeName) {\n\t\t\tif (single) {\n\t\t\t\treturn node;\n\t\t\t} else {\n\t\t\t\tresult.push(node);\n\t\t\t}\n\t\t}\n\t}\n\tif (!single) {\n\t\treturn result;\n\t}\n}\n\n/**\n * Filter all parents (ancestors) with tag name\n * @param {element} node\n * @param {string} tagname\n * @returns {element[]} parents\n * @memberof Core\n */\nexport function getParentByTagName(node, tagname) {\n\tlet parent;\n\tif (node === null || tagname === '') return;\n\tparent = node.parentNode;\n\twhile (parent.nodeType === 1) {\n\t\tif (parent.tagName.toLowerCase() === tagname) {\n\t\t\treturn parent;\n\t\t}\n\t\tparent = parent.parentNode;\n\t}\n}\n\n/**\n * Lightweight Polyfill for DOM Range\n * @class\n * @memberof Core\n */\nexport class RangeObject {\n\tconstructor() {\n\t\tthis.collapsed = false;\n\t\tthis.commonAncestorContainer = undefined;\n\t\tthis.endContainer = undefined;\n\t\tthis.endOffset = undefined;\n\t\tthis.startContainer = undefined;\n\t\tthis.startOffset = undefined;\n\t}\n\n\tsetStart(startNode, startOffset) {\n\t\tthis.startContainer = startNode;\n\t\tthis.startOffset = startOffset;\n\n\t\tif (!this.endContainer) {\n\t\t\tthis.collapse(true);\n\t\t} else {\n\t\t\tthis.commonAncestorContainer = this._commonAncestorContainer();\n\t\t}\n\n\t\tthis._checkCollapsed();\n\t}\n\n\tsetEnd(endNode, endOffset) {\n\t\tthis.endContainer = endNode;\n\t\tthis.endOffset = endOffset;\n\n\t\tif (!this.startContainer) {\n\t\t\tthis.collapse(false);\n\t\t} else {\n\t\t\tthis.collapsed = false;\n\t\t\tthis.commonAncestorContainer = this._commonAncestorContainer();\n\t\t}\n\n\t\tthis._checkCollapsed();\n\t}\n\n\tcollapse(toStart) {\n\t\tthis.collapsed = true;\n\t\tif (toStart) {\n\t\t\tthis.endContainer = this.startContainer;\n\t\t\tthis.endOffset = this.startOffset;\n\t\t\tthis.commonAncestorContainer = this.startContainer.parentNode;\n\t\t} else {\n\t\t\tthis.startContainer = this.endContainer;\n\t\t\tthis.startOffset = this.endOffset;\n\t\t\tthis.commonAncestorContainer = this.endOffset.parentNode;\n\t\t}\n\t}\n\n\tselectNode(referenceNode) {\n\t\tlet parent = referenceNode.parentNode;\n\t\tlet index = Array.prototype.indexOf.call(parent.childNodes, referenceNode);\n\t\tthis.setStart(parent, index);\n\t\tthis.setEnd(parent, index + 1);\n\t}\n\n\tselectNodeContents(referenceNode) {\n\t\tlet end = referenceNode.childNodes[referenceNode.childNodes - 1];\n\t\tlet endIndex = (referenceNode.nodeType === 3) ?\n\t\t\t\treferenceNode.textContent.length : parent.childNodes.length;\n\t\tthis.setStart(referenceNode, 0);\n\t\tthis.setEnd(referenceNode, endIndex);\n\t}\n\n\t_commonAncestorContainer(startContainer, endContainer) {\n\t\tvar startParents = parents(startContainer || this.startContainer);\n\t\tvar endParents = parents(endContainer || this.endContainer);\n\n\t\tif (startParents[0] != endParents[0]) return undefined;\n\n\t\tfor (var i = 0; i < startParents.length; i++) {\n\t\t\tif (startParents[i] != endParents[i]) {\n\t\t\t\treturn startParents[i - 1];\n\t\t\t}\n\t\t}\n\t}\n\n\t_checkCollapsed() {\n\t\tif (this.startContainer === this.endContainer &&\n\t\t\t\tthis.startOffset === this.endOffset) {\n\t\t\tthis.collapsed = true;\n\t\t} else {\n\t\t\tthis.collapsed = false;\n\t\t}\n\t}\n\n\ttoString() {\n\t\t// TODO: implement walking between start and end to find text\n\t}\n}\n"],"names":["requestAnimationFrame","ELEMENT_NODE","TEXT_NODE","_URL","uuid","d","c","documentHeight","isElement","obj","isNumber","n","isFloat","f","prefixed","unprefixed","vendors","prefixes","lower","length","i","defaults","source","prop","extend","target","sources","propName","insert","item","array","compareFunction","location","locationOf","_start","_end","start","end","pivot","compared","a","b","indexOfSorted","bounds","el","style","widthProps","heightProps","width","height","borders","nodeBounds","node","elPos","doc","elRange","windowBounds","indexOfNode","typeId","parent","children","sib","index","indexOfTextNode","textNode","indexOfElementNode","elementNode","isXml","ext","createBlob","content","mime","createBlobUrl","tempUrl","blob","revokeBlobUrl","url","createBase64Url","data","datauri","type","parse","markup","forceXMLDom","Parser","XMLDOMParser","qs","sel","elements","qsa","qsp","props","q","filtered","sprint","root","func","treeWalker","walk","filter","callback","blob2base64","resolve","reject","reader","defer","querySelectorByType","html","element","query","findChildren","result","childNodes","parents","nodes","filterChildren","nodeName","single","getParentByTagName","tagname","RangeObject","startNode","startOffset","endNode","endOffset","toStart","referenceNode","endIndex","startContainer","endContainer","startParents","endParents"],"mappings":";AAWY,MAACA,IAAyB,OAAO,SAAU,MAAgB,OAAO,yBAAyB,OAAO,4BAA4B,OAAO,+BAA+B,OAAO,0BAA2B,IAC5MC,IAAe,GACfC,IAAY,GAGZC,IAAO,OAAO,MAAO,MAAc,MAAO,OAAO,SAAU,MAAe,OAAO,OAAO,OAAO,aAAa,OAAO,SAAU;AAQ5H,SAASC,IAAO;AACtB,MAAIC,KAAI,oBAAI,KAAI,GAAG,QAAO,GACtBD,IAAO,uCAAuC,QAAQ,SAAS,SAASE,GAAG;AAC9E,QAAI,KAAKD,IAAI,KAAK,WAAS,MAAI,KAAK;AACpC,WAAAA,IAAI,KAAK,MAAMA,IAAE,EAAE,IACXC,KAAG,MAAM,IAAK,IAAE,IAAI,GAAM,SAAS,EAAE;AAAA,EAC9C,CAAC;AACD,SAAOF;AACR;AAOO,SAASG,IAAiB;AAChC,SAAO,KAAK;AAAA,IACV,SAAS,gBAAgB;AAAA,IACzB,SAAS,KAAK;AAAA,IACd,SAAS,gBAAgB;AAAA,IACzB,SAAS,KAAK;AAAA,IACd,SAAS,gBAAgB;AAAA,EAC5B;AACA;AAQO,SAASC,EAAUC,GAAK;AAC9B,SAAO,CAAC,EAAEA,KAAOA,EAAI,YAAY;AAClC;AAOO,SAASC,EAASC,GAAG;AAC3B,SAAO,CAAC,MAAM,WAAWA,CAAC,CAAC,KAAK,SAASA,CAAC;AAC3C;AAOO,SAASC,EAAQD,GAAG;AAC1B,MAAIE,IAAI,WAAWF,CAAC;AAEpB,SAAID,EAASC,CAAC,MAAM,KACZ,KAGJ,OAAOA,KAAM,YAAYA,EAAE,QAAQ,GAAG,IAAI,KACtC,KAGD,KAAK,MAAME,CAAC,MAAMA;AAC1B;AAQO,SAASC,EAASC,GAAY;AACpC,MAAIC,IAAU,CAAC,UAAU,UAAU,OAAO,KAAK,IAAI,GAC/CC,IAAW,CAAC,YAAY,YAAY,SAAS,OAAO,MAAM,GAC1DC,IAAQH,EAAW,YAAW,GAC9BI,IAASH,EAAQ;AAErB,MAAI,OAAO,WAAc,OAAe,OAAO,SAAS,KAAK,MAAME,CAAK,IAAM;AAC7E,WAAOH;AAGR,WAASK,IAAI,GAAGA,IAAID,GAAQC;AAC3B,QAAI,OAAO,SAAS,KAAK,MAAMH,EAASG,CAAC,IAAIF,CAAK,IAAM;AACvD,aAAOD,EAASG,CAAC,IAAIF;AAIvB,SAAOH;AACR;AAQO,SAASM,EAASZ,GAAK;AAC7B,WAASW,IAAI,GAAGD,IAAS,UAAU,QAAQC,IAAID,GAAQC,KAAK;AAC3D,QAAIE,IAAS,UAAUF,CAAC;AACxB,aAASG,KAAQD;AAChB,MAAIb,EAAIc,CAAI,MAAM,WAAQd,EAAIc,CAAI,IAAID,EAAOC,CAAI;AAAA,EAEnD;AACA,SAAOd;AACR;AAQO,SAASe,EAAOC,GAAQ;AAC9B,MAAIC,IAAU,CAAA,EAAG,MAAM,KAAK,WAAW,CAAC;AACxC,SAAAA,EAAQ,QAAQ,SAAUJ,GAAQ;AACjC,IAAIA,KACJ,OAAO,oBAAoBA,CAAM,EAAE,QAAQ,SAASK,GAAU;AAC7D,aAAO,eAAeF,GAAQE,GAAU,OAAO,yBAAyBL,GAAQK,CAAQ,CAAC;AAAA,IAC1F,CAAC;AAAA,EACF,CAAC,GACMF;AACR;AAWO,SAASG,EAAOC,GAAMC,GAAOC,GAAiB;AACpD,MAAIC,IAAWC,EAAWJ,GAAMC,GAAOC,CAAe;AACtD,SAAAD,EAAM,OAAOE,GAAU,GAAGH,CAAI,GAEvBG;AACR;AAYO,SAASC,EAAWJ,GAAMC,GAAOC,GAAiBG,GAAQC,GAAM;AACtE,MAAIC,IAAQF,KAAU,GAClBG,IAAMF,KAAQL,EAAM,QACpBQ,IAAQ,SAASF,KAASC,IAAMD,KAAS,CAAC,GAC1CG;AAQJ,SAPIR,MACHA,IAAkB,SAASS,GAAGC,GAAG;AAChC,QAAGD,IAAIC,EAAG,QAAO;AACjB,QAAGD,IAAIC,EAAG,QAAO;AACjB,QAAGD,KAAKC,EAAG,QAAO;AAAA,EACnB,IAEEJ,IAAID,KAAS,IACRE,KAGRC,IAAWR,EAAgBD,EAAMQ,CAAK,GAAGT,CAAI,GAC1CQ,IAAID,MAAU,IACTG,KAAY,IAAID,IAAQA,IAAQ,IAErCC,MAAa,IACRD,IAELC,MAAa,KACRN,EAAWJ,GAAMC,GAAOC,GAAiBO,GAAOD,CAAG,IAEnDJ,EAAWJ,GAAMC,GAAOC,GAAiBK,GAAOE,CAAK;AAE9D;AAaO,SAASI,EAAcb,GAAMC,GAAOC,GAAiBG,GAAQC,GAAM;AACzE,MAAIC,IAAQF,KAAU,GAClBG,IAAMF,KAAQL,EAAM,QACpBQ,IAAQ,SAASF,KAASC,IAAMD,KAAS,CAAC,GAC1CG;AAQJ,SAPIR,MACHA,IAAkB,SAASS,GAAGC,GAAG;AAChC,QAAGD,IAAIC,EAAG,QAAO;AACjB,QAAGD,IAAIC,EAAG,QAAO;AACjB,QAAGD,KAAKC,EAAG,QAAO;AAAA,EACnB,IAEEJ,IAAID,KAAS,IACR,MAGRG,IAAWR,EAAgBD,EAAMQ,CAAK,GAAGT,CAAI,GAC1CQ,IAAID,MAAU,IACTG,MAAa,IAAID,IAAQ,KAE9BC,MAAa,IACRD,IAELC,MAAa,KACRG,EAAcb,GAAMC,GAAOC,GAAiBO,GAAOD,CAAG,IAEtDK,EAAcb,GAAMC,GAAOC,GAAiBK,GAAOE,CAAK;AAEjE;AAQO,SAASK,EAAOC,GAAI;AAE1B,MAAIC,IAAQ,OAAO,iBAAiBD,CAAE,GAClCE,IAAa,CAAC,SAAS,gBAAgB,eAAe,eAAe,cAAc,oBAAoB,iBAAiB,GACxHC,IAAc,CAAC,UAAU,cAAc,iBAAiB,aAAa,gBAAgB,kBAAkB,mBAAmB,GAE1HC,IAAQ,GACRC,IAAS;AAEb,SAAAH,EAAW,QAAQ,SAASvB,GAAK;AAChC,IAAAyB,KAAS,WAAWH,EAAMtB,CAAI,CAAC,KAAK;AAAA,EACrC,CAAC,GAEDwB,EAAY,QAAQ,SAASxB,GAAK;AACjC,IAAA0B,KAAU,WAAWJ,EAAMtB,CAAI,CAAC,KAAK;AAAA,EACtC,CAAC,GAEM;AAAA,IACN,QAAQ0B;AAAA,IACR,OAAOD;AAAA,EACT;AAEA;AASO,SAASE,EAAQN,GAAI;AAE3B,MAAIC,IAAQ,OAAO,iBAAiBD,CAAE,GAClCE,IAAa,CAAC,gBAAgB,eAAe,eAAe,cAAc,oBAAoB,iBAAiB,GAC/GC,IAAc,CAAC,cAAc,iBAAiB,aAAa,gBAAgB,kBAAkB,mBAAmB,GAEhHC,IAAQ,GACRC,IAAS;AAEb,SAAAH,EAAW,QAAQ,SAASvB,GAAK;AAChC,IAAAyB,KAAS,WAAWH,EAAMtB,CAAI,CAAC,KAAK;AAAA,EACrC,CAAC,GAEDwB,EAAY,QAAQ,SAASxB,GAAK;AACjC,IAAA0B,KAAU,WAAWJ,EAAMtB,CAAI,CAAC,KAAK;AAAA,EACtC,CAAC,GAEM;AAAA,IACN,QAAQ0B;AAAA,IACR,OAAOD;AAAA,EACT;AAEA;AASO,SAASG,EAAWC,GAAM;AAChC,MAAIC,GACAC,IAAMF,EAAK;AACf,MAAGA,EAAK,YAAY,KAAK,WAAU;AAClC,QAAIG,IAAUD,EAAI,YAAW;AAC7B,IAAAC,EAAQ,mBAAmBH,CAAI,GAC/BC,IAAQE,EAAQ,sBAAqB;AAAA,EACtC;AACC,IAAAF,IAAQD,EAAK,sBAAqB;AAEnC,SAAOC;AACR;AAOO,SAASG,IAAe;AAE9B,MAAIR,IAAQ,OAAO,YACfC,IAAS,OAAO;AAEpB,SAAO;AAAA,IACN,KAAK;AAAA,IACL,MAAM;AAAA,IACN,OAAOD;AAAA,IACP,QAAQC;AAAA,IACR,OAAOD;AAAA,IACP,QAAQC;AAAA,EACV;AAEA;AASO,SAASQ,EAAYL,GAAMM,GAAQ;AAKzC,WAJIC,IAASP,EAAK,YACdQ,IAAWD,EAAO,YAClBE,GACAC,IAAQ,IACH1C,IAAI,GAAGA,IAAIwC,EAAS,WAC5BC,IAAMD,EAASxC,CAAC,GACZyC,EAAI,aAAaH,KACpBI,KAEGD,KAAOT,IALyBhC;AAKpC;AAGD,SAAO0C;AACR;AAQO,SAASC,EAAgBC,GAAU;AACzC,SAAOP,EAAYO,GAAU9D,CAAS;AACvC;AAQO,SAAS+D,EAAmBC,GAAa;AAC/C,SAAOT,EAAYS,GAAajE,CAAY;AAC7C;AAQO,SAASkE,EAAMC,GAAK;AAC1B,SAAO,CAAC,OAAO,OAAO,KAAK,EAAE,QAAQA,CAAG,IAAI;AAC7C;AASO,SAASC,EAAWC,GAASC,GAAK;AACxC,SAAO,IAAI,KAAK,CAACD,CAAO,GAAG,EAAC,MAAOC,GAAM;AAC1C;AASO,SAASC,EAAcF,GAASC,GAAK;AAC3C,MAAIE,GACAC,IAAOL,EAAWC,GAASC,CAAI;AAEnC,SAAAE,IAAUtE,EAAK,gBAAgBuE,CAAI,GAE5BD;AACR;AAOO,SAASE,EAAcC,GAAI;AACjC,SAAOzE,EAAK,gBAAgByE,CAAG;AAChC;AASO,SAASC,EAAgBP,GAASC,GAAK;AAC7C,MAAIO,GACAC;AAEJ,MAAI,OAAOT,KAAa;AAKxB,WAAAQ,IAAO,KAAKR,CAAO,GAEnBS,IAAU,UAAUR,IAAO,aAAaO,GAEjCC;AACR;AAQO,SAASC,EAAKvE,GAAI;AACxB,SAAO,OAAO,UAAU,SAAS,KAAKA,CAAG,EAAE,MAAM,GAAG,EAAE;AACvD;AAUO,SAASwE,EAAMC,GAAQX,GAAMY,GAAa;AAChD,MAAI7B,GACA8B;AAEJ,SAAI,OAAO,YAAc,OAAeD,IACvCC,IAASC,IAETD,IAAS,WAKPF,EAAO,WAAW,CAAC,MAAM,UAC3BA,IAASA,EAAO,MAAM,CAAC,IAGxB5B,IAAM,IAAI8B,EAAM,EAAG,gBAAgBF,GAAQX,CAAI,GAExCjB;AACR;AASO,SAASgC,EAAG1C,GAAI2C,GAAK;AAC3B,MAAIC;AACJ,MAAI,CAAC5C;AACJ,UAAM,IAAI,MAAM,qBAAqB;AAGtC,MAAI,OAAOA,EAAG,gBAAiB;AAC9B,WAAOA,EAAG,cAAc2C,CAAG;AAG3B,MADAC,IAAW5C,EAAG,qBAAqB2C,CAAG,GAClCC,EAAS;AACZ,WAAOA,EAAS,CAAC;AAGpB;AASO,SAASC,EAAI7C,GAAI2C,GAAK;AAE5B,SAAI,OAAO3C,EAAG,gBAAiB,MACvBA,EAAG,iBAAiB2C,CAAG,IAEvB3C,EAAG,qBAAqB2C,CAAG;AAEpC;AAUO,SAASG,EAAI9C,GAAI2C,GAAKI,GAAO;AACnC,MAAIC,GAAGC;AACP,MAAI,OAAOjD,EAAG,gBAAiB,KAAa;AAC3C,IAAA2C,KAAO;AACP,aAAShE,KAAQoE;AAChB,MAAAJ,KAAOhE,IAAO,QAAQoE,EAAMpE,CAAI,IAAI;AAErC,WAAAgE,KAAO,KACA3C,EAAG,cAAc2C,CAAG;AAAA,EAC5B,WACCK,IAAIhD,EAAG,qBAAqB2C,CAAG,GAC/BM,IAAW,MAAM,UAAU,MAAM,KAAKD,GAAG,CAAC,EAAE,OAAO,SAAShD,GAAI;AAC/D,aAASrB,KAAQoE;AAChB,UAAG/C,EAAG,aAAarB,CAAI,MAAMoE,EAAMpE,CAAI;AACtC,eAAO;AAGT,WAAO;AAAA,EACR,CAAC,GAEGsE;AACH,WAAOA,EAAS,CAAC;AAGpB;AAQO,SAASC,EAAOC,GAAMC,GAAM;AAClC,MAAI1C,IAAMyC,EAAK,iBAAiBA;AAChC,EAAI,OAAOzC,EAAI,mBAAsB,MACpC2C,EAAWF,GAAMC,GAAM,WAAW,SAAS,IAE3CE,EAAKH,GAAM,SAAS3C,GAAM;AACzB,IAAIA,KAAQA,EAAK,aAAa,KAC7B4C,EAAK5C,CAAI;AAAA,EAEX,CAAO;AAET;AASO,SAAS6C,EAAWF,GAAMC,GAAMG,GAAQ;AAC9C,MAAIF,IAAa,SAAS,iBAAiBF,GAAMI,GAAQ,MAAM,EAAK;AACpE,MAAI/C;AACJ,SAAQA,IAAO6C,EAAW;AACzB,IAAAD,EAAK5C,CAAI;AAEX;AAOO,SAAS8C,EAAK9C,GAAKgD,GAAS;AAClC,MAAGA,EAAShD,CAAI;AACf,WAAO;AAGR,MADAA,IAAOA,EAAK,YACTA;AACF,OAAE;AAED,UADa8C,EAAK9C,GAAKgD,CAAQ;AAE9B,eAAO;AAER,MAAAhD,IAAOA,EAAK;AAAA,IACb,SAAQA;AAEV;AAQO,SAASiD,EAAY3B,GAAM;AACjC,SAAO,IAAI,QAAQ,SAAS4B,GAASC,GAAQ;AAC5C,QAAIC,IAAS,IAAI,WAAU;AAC3B,IAAAA,EAAO,cAAc9B,CAAI,GACzB8B,EAAO,YAAY,WAAW;AAC7B,MAAAF,EAAQE,EAAO,MAAM;AAAA,IACtB;AAAA,EACD,CAAC;AACF;AAQO,SAASC,IAAQ;AAQvB,OAAK,UAAU,MASf,KAAK,SAAS,MAEd,KAAK,KAAKrG,EAAI,GAKd,KAAK,UAAU,IAAI,QAAQ,CAACkG,GAASC,MAAW;AAC/C,SAAK,UAAUD,GACf,KAAK,SAASC;AAAA,EACf,CAAC,GACD,OAAO,OAAO,IAAI;AACnB;AAUO,SAASG,EAAoBC,GAAMC,GAAS5B,GAAK;AACvD,MAAI6B;AAKJ,MAJI,OAAOF,EAAK,gBAAiB,QAChCE,IAAQF,EAAK,cAAc,GAAGC,CAAO,YAAY5B,CAAI,IAAI,IAGvD,CAAC6B,KAASA,EAAM,WAAW,GAAG;AAChC,IAAAA,IAAQpB,EAAIkB,GAAMC,CAAO;AACzB,aAAS,IAAI,GAAG,IAAIC,EAAM,QAAQ;AACjC,UAAGA,EAAM,CAAC,EAAE,eAAe,gCAAgC,MAAM,MAAM7B,KACrE6B,EAAM,CAAC,EAAE,aAAa,WAAW,MAAM7B;AACxC,eAAO6B,EAAM,CAAC;AAAA,EAGjB;AACC,WAAOA;AAET;AAQO,SAASC,EAAalE,GAAI;AAGhC,WAFImE,IAAS,CAAA,GACTC,IAAapE,EAAG,YACXxB,IAAI,GAAGA,IAAI4F,EAAW,QAAQ5F,KAAK;AAC3C,QAAIgC,IAAO4D,EAAW5F,CAAC;AACvB,IAAIgC,EAAK,aAAa,KACrB2D,EAAO,KAAK3D,CAAI;AAAA,EAElB;AACA,SAAO2D;AACR;AAQO,SAASE,EAAQ7D,GAAM;AAE7B,WADI8D,IAAQ,CAAC9D,CAAI,GACVA,GAAMA,IAAOA,EAAK;AACxB,IAAA8D,EAAM,QAAQ9D,CAAI;AAEnB,SAAO8D;AACR;AAUO,SAASC,EAAevE,GAAIwE,GAAUC,GAAQ;AAGpD,WAFIN,IAAS,CAAA,GACTC,IAAapE,EAAG,YACXxB,IAAI,GAAGA,IAAI4F,EAAW,QAAQ5F,KAAK;AAC3C,QAAIgC,IAAO4D,EAAW5F,CAAC;AACvB,QAAIgC,EAAK,aAAa,KAAKA,EAAK,SAAS,YAAW,MAAOgE,GAAU;AACpE,UAAIC;AACH,eAAOjE;AAEP,MAAA2D,EAAO,KAAK3D,CAAI;AAAA,IAElB;AAAA,EACD;AACA,MAAI,CAACiE;AACJ,WAAON;AAET;AASO,SAASO,GAAmBlE,GAAMmE,GAAS;AACjD,MAAI5D;AACJ,MAAI,EAAAP,MAAS,QAAQmE,MAAY;AAEjC,SADA5D,IAASP,EAAK,YACPO,EAAO,aAAa,KAAG;AAC7B,UAAIA,EAAO,QAAQ,YAAW,MAAO4D;AACpC,eAAO5D;AAER,MAAAA,IAASA,EAAO;AAAA,IACjB;AACD;AAOO,MAAM6D,GAAY;AAAA,EACxB,cAAc;AACb,SAAK,YAAY,IACjB,KAAK,0BAA0B,QAC/B,KAAK,eAAe,QACpB,KAAK,YAAY,QACjB,KAAK,iBAAiB,QACtB,KAAK,cAAc;AAAA,EACpB;AAAA,EAEA,SAASC,GAAWC,GAAa;AAChC,SAAK,iBAAiBD,GACtB,KAAK,cAAcC,GAEd,KAAK,eAGT,KAAK,0BAA0B,KAAK,yBAAwB,IAF5D,KAAK,SAAS,EAAI,GAKnB,KAAK,gBAAe;AAAA,EACrB;AAAA,EAEA,OAAOC,GAASC,GAAW;AAC1B,SAAK,eAAeD,GACpB,KAAK,YAAYC,GAEZ,KAAK,kBAGT,KAAK,YAAY,IACjB,KAAK,0BAA0B,KAAK,yBAAwB,KAH5D,KAAK,SAAS,EAAK,GAMpB,KAAK,gBAAe;AAAA,EACrB;AAAA,EAEA,SAASC,GAAS;AACjB,SAAK,YAAY,IACbA,KACH,KAAK,eAAe,KAAK,gBACzB,KAAK,YAAY,KAAK,aACtB,KAAK,0BAA0B,KAAK,eAAe,eAEnD,KAAK,iBAAiB,KAAK,cAC3B,KAAK,cAAc,KAAK,WACxB,KAAK,0BAA0B,KAAK,UAAU;AAAA,EAEhD;AAAA,EAEA,WAAWC,GAAe;AACzB,QAAInE,IAASmE,EAAc,YACvBhE,IAAQ,MAAM,UAAU,QAAQ,KAAKH,EAAO,YAAYmE,CAAa;AACzE,SAAK,SAASnE,GAAQG,CAAK,GAC3B,KAAK,OAAOH,GAAQG,IAAQ,CAAC;AAAA,EAC9B;AAAA,EAEA,mBAAmBgE,GAAe;AACvB,IAAAA,EAAc,WAAWA,EAAc,aAAa,CAAC;AAC/D,QAAIC,IAAYD,EAAc,aAAa,IACzCA,EAAc,YAAY,SAAS,OAAO,WAAW;AACvD,SAAK,SAASA,GAAe,CAAC,GAC9B,KAAK,OAAOA,GAAeC,CAAQ;AAAA,EACpC;AAAA,EAEA,yBAAyBC,GAAgBC,GAAc;AACtD,QAAIC,IAAejB,EAAQe,KAAkB,KAAK,cAAc,GAC5DG,IAAalB,EAAQgB,KAAgB,KAAK,YAAY;AAE1D,QAAIC,EAAa,CAAC,KAAKC,EAAW,CAAC;AAEnC,eAAS/G,IAAI,GAAGA,IAAI8G,EAAa,QAAQ9G;AACxC,YAAI8G,EAAa9G,CAAC,KAAK+G,EAAW/G,CAAC;AAClC,iBAAO8G,EAAa9G,IAAI,CAAC;AAAA;AAAA,EAG5B;AAAA,EAEA,kBAAkB;AACjB,IAAI,KAAK,mBAAmB,KAAK,gBAC/B,KAAK,gBAAgB,KAAK,YAC3B,KAAK,YAAY,KAEjB,KAAK,YAAY;AAAA,EAEnB;AAAA,EAEA,WAAW;AAAA,EAEX;AACD;","x_google_ignoreList":[0]}