{"version":3,"file":"loader.b2036587.js","sources":["webpack:///../zebomba-app/assets/js/loader/Resource.js","webpack:///../zebomba-app/assets/js/loader/utils.js","webpack:///../zebomba-app/assets/js/loader/ResourcesCollection.js","webpack:///../zebomba-app/assets/js/loader/Request.js","webpack:///../zebomba-app/assets/js/loader/LoadQueue.js","webpack:///../zebomba-app/assets/js/loader/LoadController.js","webpack:///../zebomba-app/assets/js/loader/parsers/ManifestParser.js","webpack:///../zebomba-app/assets/js/loader/parsers/JSONParser.js","webpack:///../zebomba-app/assets/js/hashedCSS.js","webpack:///../zebomba-app/assets/js/loader/parsers/cssParser/CSSStyle.js","webpack:///../zebomba-app/assets/js/loader/parsers/CSSParser.js","webpack:///../zebomba-app/assets/js/loader/parsers/ImageParser.js","webpack:///../zebomba-app/assets/js/loader/parsers/HTMLParser.js","webpack:///../zebomba-app/assets/js/loader/parsers/AudioParser.js","webpack:///../zebomba-app/assets/js/loader/Loader.js","webpack:///../zebomba-app/assets/js/loader/parsers/JSParser.js","webpack:///../zebomba-app/assets/js/loader/parsers/Parser.js"],"sourceRoot":"","sourcesContent":["import EventTarget from 'eventemitter3'\r\nimport Loader from './Loader.js'\r\n\r\nconst getExtension = query => {\r\n\t// учтён вопросительный знак (some.js?v123)\r\n\tconst match = query.match(/\\.(\\w+)(\\?.+)*$/)\r\n\r\n\treturn match && match[1]\r\n}\r\n\r\nclass Resource extends EventTarget {\r\n\t/** @type { string } Строка вида \"/some/folder/file.ext\" */\r\n\t#id\r\n\r\n\t/** @type { string[] } Теги ресурса (они же алиасы) */\r\n\ttags\r\n\r\n\t/** @type { boolean } Загружен ли ресурс */\r\n\tisLoaded = false\r\n\r\n\t/** @type { boolean } Загружается ли ресурс */\r\n\tisLoading = false\r\n\r\n\t/** @type { boolean } Важен ли ресурс для загрузки */\r\n\tisCritical = false\r\n\r\n\t/** @type { boolean } Уничтожен ли ресурс */\r\n\tisReduced = false\r\n\r\n\t#data\r\n\r\n\t#type\r\n\r\n\t#href\r\n\r\n\t#version\r\n\r\n\t#loadPromise\r\n\r\n\t#options\r\n\r\n\t/** @type { String } */\r\n\t#extension\r\n\r\n\tconstructor( id, data ) {\r\n\t\tsuper()\r\n\r\n\t\tthis.#id = id\r\n\r\n\t\tif (data) {\r\n\t\t\tthis._initProps(data)\r\n\t\t}\r\n\r\n\t\tthis._defineType(data)\r\n\t}\r\n\r\n\t_initProps( data ) {\r\n\t\tconst { tags, href, version, options, isErrorsIgnore, isOnTheDevice, hash, extension } = data\r\n\r\n\t\tif (tags) {\r\n\t\t\tthis.tags = tags\r\n\t\t}\r\n\r\n\t\tif (hash) {\r\n\t\t\tthis.hash = hash\r\n\t\t}\r\n\r\n\t\tif (href) {\r\n\t\t\tthis.#href = href\r\n\t\t}\r\n\r\n\t\tif (version) {\r\n\t\t\tthis.#version = version\r\n\t\t}\r\n\r\n\t\tif (options) {\r\n\t\t\tthis.#options = options\r\n\r\n\t\t\tif (options.hasOwnProperty('music')) {\r\n\t\t\t\tthis.music = Boolean(options.music)\r\n\t\t\t}\r\n\r\n\t\t\tif (options.hasOwnProperty('volume')) {\r\n\t\t\t\tthis.volume = options.volume > 0 && options.volume < 1 ? options.volume : 1\r\n\t\t\t}\r\n\r\n\t\t\tif (options.hasOwnProperty('voice')) {\r\n\t\t\t\tthis.voice = Boolean(options.voice)\r\n\t\t\t}\r\n\r\n\t\t\tif (options.hasOwnProperty('isPixi')) {\r\n\t\t\t\tthis.isPixi = Boolean(options.isPixi)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isErrorsIgnore) {\r\n\t\t\tthis.isErrorsIgnore = isErrorsIgnore\r\n\t\t}\r\n\r\n\t\tif (isOnTheDevice) {\r\n\t\t\tthis.isOnTheDevice = isOnTheDevice\r\n\t\t}\r\n\r\n\t\tthis.#extension = extension || getExtension(this.#id)\r\n\r\n\t\tthis.isCritical = extension === 'css' || extension === 'json' || extension === 'html' || extension === 'js'\r\n\r\n\t\tif (IS_DEV) {\r\n\t\t\tthis.sizeInKb = Number(data.sizeInKb || 0)\r\n\t\t}\r\n\t}\r\n\r\n\t_defineType( data ) {\r\n\t\tconst extension = this.#extension\r\n\r\n\t\tif (data && data.type) {\r\n\t\t\tthis.#type = data.type\r\n\t\t}\r\n\t\telse {\r\n\t\t\tif (extension === 'mp3') {\r\n\t\t\t\tthis.#type = 'audio'\r\n\t\t\t}\r\n\t\t\telse if (extension === 'png' || extension === 'jpg' || extension === 'webp' || extension === 'svg') {\r\n\t\t\t\tthis.#type = 'image'\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthis.#type = extension\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** @returns { Promise } Загрузка ресурса */\r\n\tload() {\r\n\t\tif (!this.#loadPromise) {\r\n\t\t\tconst parser = Loader.parsers[this.#type]\r\n\r\n\t\t\tif (parser) {\r\n\t\t\t\tthis.isLoading = true\r\n\r\n\t\t\t\tthis.#loadPromise = new Promise(resolve => {\r\n\t\t\t\t\tconst onDone = data => {\r\n\t\t\t\t\t\tthis.isLoaded = true\r\n\t\t\t\t\t\tthis.isLoading = false\r\n\t\t\t\t\t\tthis.#data = data\r\n\r\n\t\t\t\t\t\tresolve(data)\r\n\r\n\t\t\t\t\t\tthis.emit('loaded')\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tparser\r\n\t\t\t\t\t\t.parse(this)\r\n\t\t\t\t\t\t.then(onDone)\r\n\t\t\t\t\t\t.catch(onDone)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.error(`Failed to load resource: \"${ this.#id }\".\\nYou may need an appropriate parser to handle this resource type.`)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.#loadPromise\r\n\t}\r\n\r\n\treduce() {\r\n\t\tLoader.instance.reduce(this)\r\n\t}\r\n\r\n\tdispose() {\r\n\t\tthis.isReduced = true\r\n\r\n\t\tthis.#data = null\r\n\r\n\t\tif (!this.isLoading && !this.isLoaded) {\r\n\t\t\t// Если в течение загрузки коллекции некоторые ресурсы уничтожаются,\r\n\t\t\t// то для продолжения загрузки считаем уничтоженный ресурс загруженным (обработанным)\r\n\t\t\tthis.emit('loaded')\r\n\t\t}\r\n\t}\r\n\r\n\t/** @type { string } Строка вида \"/some/folder/file.ext\" */\r\n\tget id() {\r\n\t\treturn this.#id\r\n\t}\r\n\r\n\t/** @type { string } Строка вида \"/some/folder/file.ext\" */\r\n\tget name() {\r\n\t\treturn this.#id\r\n\t}\r\n\r\n\t/** @type { string } Расширение файла ресурса */\r\n\tget extension() {\r\n\t\treturn this.#extension\r\n\t}\r\n\r\n\t/** @type { any } Данные ресурса */\r\n\tget data() {\r\n\t\treturn this.#data\r\n\t}\r\n\r\n\t/** @type { any } Версия ресурса (к пути добавляется ?v) */\r\n\tget version() {\r\n\t\treturn this.#version\r\n\t}\r\n\r\n\tget options() {\r\n\t\treturn this.#options\r\n\t}\r\n\r\n\t/** @type { string } Полный путь до файла ресурса */\r\n\tget href() {\r\n\t\treturn this.#href || (this.#href = Loader.getResourceHref(this))\r\n\t}\r\n\r\n\tget isStyle() {\r\n\t\treturn this.extension === 'css'\r\n\t}\r\n\r\n\tget isImage() {\r\n\t\treturn this.extension === 'png' || this.extension === 'jpg' || this.extension === 'webp'\r\n\t}\r\n\r\n\tget isAudio() {\r\n\t\treturn this.extension === 'mp3'\r\n\t}\r\n}\r\n\r\nexport default Resource","function parseURL( url ) {\r\n\tconst struct = {\r\n\t\tprotocol: '',\r\n\t\thostname: '',\r\n\t\tport: '',\r\n\t\tpathname: '',\r\n\t\tdir: '',\r\n\t\tbase: '',\r\n\t\tsearch: ''\r\n\t}\r\n\r\n\tif (window.location && typeof window.location.protocol == 'string' && typeof window.location.hostname == 'string' && typeof window.location.port == 'string' && typeof window.location.pathname == 'string') {\r\n\t\tstruct.protocol = window.location.protocol\r\n\t\tstruct.hostname = window.location.hostname\r\n\t\tstruct.port = window.location.port\r\n\t\tstruct.pathname = window.location.pathname\r\n\t}\r\n\telse {\r\n\t\ttry {\r\n\t\t\tconst location = new URL(document.URL)\r\n\r\n\t\t\tif (typeof location.protocol == 'string' && typeof location.hostname == 'string' && typeof location.port == 'string' && typeof location.pathname == 'string') {\r\n\t\t\t\tstruct.protocol = location.protocol\r\n\t\t\t\tstruct.hostname = location.hostname\r\n\t\t\t\tstruct.port = location.port\r\n\t\t\t\tstruct.pathname = location.pathname\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (exception) { console.warn(exception) }\r\n\t}\r\n\r\n\tif (!url.indexOf('data:')) {\r\n\t\tstruct.protocol = 'data:'\r\n\t\tstruct.hostname = ''\r\n\t\tstruct.port = ''\r\n\t\tstruct.pathname = ''\r\n\t\tstruct.dir = ''\r\n\t\tstruct.base = url.substring(5)\r\n\t}\r\n\telse if (!url.indexOf('blob:')) {\r\n\t\tstruct.protocol = 'blob:'\r\n\t\tstruct.hostname = ''\r\n\t\tstruct.port = ''\r\n\t\tstruct.pathname = ''\r\n\t\tstruct.dir = ''\r\n\t\tstruct.base = url.substring(5)\r\n\t}\r\n\telse {\r\n\t\t// Обработка URL с явным указанием протокола ('http://', 'https://')\r\n\t\tconst protocolMatch = url.match(/^([^(?:://)]+:)\\/\\//)\r\n\r\n\t\tif (protocolMatch) {\r\n\t\t\tstruct.protocol = protocolMatch[1]\r\n\r\n\t\t\t/** @type { RegExpMatchArray } */\r\n\t\t\tlet hostnameMatch\r\n\r\n\t\t\t// Обработка URL с указанием хоста и порта\r\n\t\t\tif ((hostnameMatch = url.match(/\\/\\/([^:^/]+)(:\\d+)/))) {\r\n\t\t\t\tstruct.hostname = hostnameMatch[1]\r\n\t\t\t\tstruct.port = hostnameMatch[2].replace(':', '')\r\n\r\n\t\t\t\tconst pathnameMatch = url.match(/\\/\\/[^:^/]+:\\d+(\\/[^?]+)/)\r\n\t\t\t\tif (pathnameMatch) {\r\n\t\t\t\t\tstruct.pathname = pathnameMatch[1]\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tstruct.pathname = '/'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if ((hostnameMatch = url.match(/\\/\\/([^/]+)/))) {\r\n\t\t\t\t// Обработка URL с указанием хоста без порта\r\n\t\t\t\tstruct.hostname = hostnameMatch[1]\r\n\r\n\t\t\t\tconst pathnameMatch = url.match(/\\/\\/[^/]+(\\/[^?]+)/)\r\n\t\t\t\tif (pathnameMatch) {\r\n\t\t\t\t\tstruct.pathname = pathnameMatch[1]\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tstruct.pathname = '/'\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tthrow new Error('Failed to parse url.')\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\t/** @type { RegExpMatchArray } */\r\n\t\t\tlet hostnameMatch\r\n\r\n\t\t\t// Обработка URL с указанием хоста и порта\r\n\t\t\tif ((hostnameMatch = url.match(/^\\/\\/([^/^:]+)(:\\d+)/))) {\r\n\t\t\t\tstruct.hostname = hostnameMatch[1]\r\n\t\t\t\tstruct.port = hostnameMatch[2]\r\n\r\n\t\t\t\tconst pathnameMatch = url.match(/^\\/\\/[^/^:]+:\\d+(\\/[^?]+)/)\r\n\t\t\t\tif (pathnameMatch) {\r\n\t\t\t\t\tstruct.pathname = pathnameMatch[1]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Обработка URL с указанием хоста без порта\r\n\t\t\telse if ((hostnameMatch = url.match(/^\\/\\/([^/]+)/))) {\r\n\t\t\t\tstruct.hostname = hostnameMatch[1]\r\n\r\n\t\t\t\tconst pathnameMatch = url.match(/^\\/\\/[^/]+(\\/[^?]+)/)\r\n\t\t\t\tif (pathnameMatch) {\r\n\t\t\t\t\tstruct.pathname = pathnameMatch[1]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// Обработка URL с явным указанием пути\r\n\t\t\telse if ((hostnameMatch = url.match(/^(\\/[^/][^?]+)/))) {\r\n\t\t\t\tstruct.pathname = hostnameMatch[1]\r\n\t\t\t}\r\n\t\t\t// Обработка URL без указания явного пути\r\n\t\t\telse {\r\n\t\t\t\tstruct.pathname = url.replace(/^([^?]+).*$/, '$1')\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (/^[^/]/.test(struct.pathname)) {\r\n\t\t\tif (window.location && typeof window.location.pathname == 'string') {\r\n\t\t\t\tstruct.pathname = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + struct.pathname\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst location = new URL(document.URL)\r\n\t\t\t\t\tif (location && typeof location.pathname == 'string') {\r\n\t\t\t\t\t\tstruct.pathname = location.pathname.substring(0, location.pathname.lastIndexOf('/') + 1) + struct.pathname\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tstruct.protocol = ''\r\n\t\t\t\t\t\tstruct.hostname = ''\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch (exception) {\r\n\t\t\t\t\tconsole.warn(exception)\r\n\t\t\t\t\tstruct.protocol = ''\r\n\t\t\t\t\tstruct.hostname = ''\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Удаление лишних символов в пути URL\r\n\t\tstruct.pathname = struct.pathname\r\n\t\t\t.replace(/\\/\\.\\//g, '/')\r\n\t\t\t.replace(/\\/\\.$/, '/')\r\n\r\n\t\t// Разделение пути на директорию и базовое имя файла\r\n\t\tif (struct.pathname.match(/\\/$/)) {\r\n\t\t\tstruct.dir = struct.pathname\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst dir = struct.pathname.split('/')\r\n\t\t\tconst base = dir.pop()\r\n\r\n\t\t\tstruct.dir = dir.join('/') + '/'\r\n\t\t\tstruct.base = base\r\n\t\t}\r\n\r\n\t\tconst searchMatch = url.match(/[^?]+(\\?.+)$/)\r\n\t\tif (searchMatch) {\r\n\t\t\tstruct.search = searchMatch[1]\r\n\t\t}\r\n\t}\r\n\r\n\tif (struct.protocol == 'about:') {\r\n\t\tstruct.protocol = ''\r\n\t}\r\n\r\n\treturn struct\r\n}\r\n\r\n/**\r\n * @param { string } string\r\n * @param { string[] } tags\r\n * @returns { boolean }\r\n */\r\nfunction evaluate( string, tags ) {\r\n\t/** @type { ReturnType } */\r\n\tlet operation\r\n\r\n\tif (isOperandSimple(string)) {\r\n\t\treturn tags.indexOf(string) !== -1\r\n\t}\r\n\telse {\r\n\t\toperation = getLowestPriorityOperation(string)\r\n\r\n\t\tif (operation.operator === '!') {\r\n\t\t\treturn !evaluate(operation.operand1, tags)\r\n\t\t}\r\n\r\n\t\tif (operation.operator === '&') {\r\n\t\t\treturn evaluate(operation.operand1, tags) && evaluate(operation.operand2, tags)\r\n\t\t}\r\n\r\n\t\tif (operation.operator === '|') {\r\n\t\t\treturn evaluate(operation.operand1, tags) || evaluate(operation.operand2, tags)\r\n\t\t}\r\n\r\n\t\tthrow new TypeError('Failed to execute \\'load\\' on \\'Loader\\': unknown operator `' + operation.operator + '`.')\r\n\t}\r\n}\r\n\r\nconst operandsPriority = [ '!', '&', '|' ]\r\n\r\n/** @param { string } operand */\r\nfunction isOperandSimple( operand ) {\r\n\tfor (let i = 0; i < operandsPriority.length; i ++) {\r\n\t\tif (operand.indexOf(operandsPriority[i]) !== -1) {\r\n\t\t\treturn false\r\n\t\t}\r\n\t}\r\n\r\n\treturn true\r\n}\r\n\r\n/**\r\n * @param { string } string\r\n * @returns {{ operator: string, operand1?: string, operand2?: string }}\r\n */\r\nfunction getLowestPriorityOperation( string ) {\r\n\tlet i = operandsPriority.length - 1\r\n\tlet index = -1\r\n\tlet operator = ''\r\n\tlet operand1 = ''\r\n\tlet operand2 = ''\r\n\r\n\tdo {\r\n\t\toperator = operandsPriority[i --]\r\n\t\tindex = string.indexOf(operator)\r\n\t} while (index == -1 && i >= 0)\r\n\r\n\tif (index != -1) {\r\n\t\tif (operator === '!') {\r\n\t\t\toperand1 = string.substring(index + 1)\r\n\t\t}\r\n\t\telse {\r\n\t\t\toperand1 = string.substring(0, index)\r\n\t\t\toperand2 = string.substring(index + 1)\r\n\t\t}\r\n\t}\r\n\telse {\r\n\t\treturn { operator: '' }\r\n\t}\r\n\r\n\treturn {\r\n\t\toperator: operator,\r\n\t\toperand1: operand1 || '',\r\n\t\toperand2: operand2 || ''\r\n\t}\r\n}\r\n\r\nexport {\r\n\tparseURL,\r\n\tevaluate\r\n}","import EventTarget from 'eventemitter3'\r\nimport Resource from './Resource.js'\r\nimport { evaluate } from './utils.js'\r\nimport Loader from './Loader.js'\r\n\r\nclass ResourcesCollection extends EventTarget {\r\n\t#resources = {}\r\n\r\n\t/** @type { Resource[] } */\r\n\t#unloadedResources = []\r\n\r\n\t#isPrioritized = false\r\n\r\n\t#loadPromise\r\n\r\n\t#loadResolver\r\n\r\n\t#resourcesCounter = 0\r\n\r\n\t/** @returns { Promise } */\r\n\tload( onProgress, isPrioritized = false ) {\r\n\t\tif (this.#loadPromise) {\r\n\t\t\treturn this.#loadPromise\r\n\t\t}\r\n\r\n\t\tif (!this.#unloadedResources.length) {\r\n\t\t\treturn this.#loadPromise = Promise.resolve()\r\n\t\t}\r\n\r\n\t\tthis.#loadPromise = new Promise(resolve => { this.#loadResolver = resolve })\r\n\r\n\t\tthis.#isPrioritized = isPrioritized\r\n\r\n\t\tLoader.instance.load(this, onProgress, isPrioritized)\r\n\r\n\t\tif (onProgress) {\r\n\t\t\tthis._processOnProgress(onProgress)\r\n\t\t}\r\n\r\n\t\treturn this.#loadPromise\r\n\t}\r\n\r\n\t/** @param { string | string[] } tag */\r\n\tfindByTag( tag ) {\r\n\t\tconst collection = new ResourcesCollection()\r\n\r\n\t\tlet tagString = '',\r\n\t\t\tresourceID,\r\n\t\t\tresource,\r\n\t\t\tresources = this.#resources\r\n\r\n\t\tif (typeof tag === 'string') {\r\n\t\t\ttagString = tag\r\n\t\t}\r\n\t\telse {\r\n\t\t\ttagString = tag.join('|')\r\n\t\t}\r\n\r\n\t\ttagString = tagString.replace(/\\s/g, '')\r\n\r\n\t\tfor (resourceID in resources) {\r\n\t\t\tresource = resources[resourceID]\r\n\r\n\t\t\tif (resource && resource.tags && evaluate(tagString, resource.tags)) {\r\n\t\t\t\tcollection.pushResource(resource)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn collection\r\n\t}\r\n\r\n\t/** @param { string | string[] | RegExp | RegExp[] } query */\r\n\tfindByName( name ) {\r\n\t\tconst collection = new ResourcesCollection()\r\n\r\n\t\tlet resourceID,\r\n\t\t\tresource,\r\n\t\t\tresources = this.#resources\r\n\r\n\t\tconst checkResourceString = (findName, resource) => {\r\n\t\t\tif (!resource) {\r\n\t\t\t\treturn\r\n\t\t\t}\r\n\r\n\t\t\tif (findName === resource.id) {\r\n\t\t\t\treturn collection.pushResource(resource)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst checkResourceRegExp = (findName, resource) => {\r\n\t\t\tif (resource && findName.test(resource.id)) {\r\n\t\t\t\treturn collection.pushResource(resource)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst tryFind = query => {\r\n\t\t\tif (typeof query === 'string') {\r\n\t\t\t\tif (Loader.isWebpSupported) {\r\n\t\t\t\t\tquery = query.replace(/\\.(png|jpg)$/, '.webp')\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresource = resources[query]\r\n\r\n\t\t\t\tcheckResourceString(query, resource)\r\n\t\t\t}\r\n\t\t\telse if (query instanceof RegExp) {\r\n\t\t\t\tfor (resourceID in resources) {\r\n\t\t\t\t\tresource = resources[resourceID]\r\n\r\n\t\t\t\t\tcheckResourceRegExp(query, resource)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (Array.isArray(query)) {\r\n\t\t\t\tconst list = query\r\n\t\t\t\tlet item\r\n\r\n\t\t\t\tfor (item of list) {\r\n\t\t\t\t\ttryFind(item)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\ttryFind(name)\r\n\r\n\t\treturn collection\r\n\t}\r\n\r\n\t_loadResources() {\r\n\r\n\t}\r\n\r\n\t/** Создание и добавление нового ресурса */\r\n\taddResource( resourceID, data ) {\r\n\t\t// todo: вынести общую часть с pushResource в отдельный метод\r\n\t\tif (!this.#resources[resourceID]) {\r\n\t\t\tthis.#resourcesCounter ++\r\n\r\n\t\t\tconst resource = new Resource(resourceID, data)\r\n\r\n\t\t\tthis.#resources[resourceID] = resource\r\n\r\n\t\t\tif (!resource.isLoaded) {\r\n\t\t\t\tthis._addUnloadedResource(resource)\r\n\t\t\t}\r\n\r\n\t\t\treturn resource\r\n\t\t}\r\n\r\n\t\t// console.error(`Ресурс \"${ resourceID }\" уже существует.`)\r\n\t}\r\n\r\n\tremoveResource( resourceID ) {\r\n\t\t// Не юзать 'delete'. Плохо для оптимизации.\r\n\t\tconst resource = this.#resources[resourceID]\r\n\r\n\t\tif (resource) {\r\n\t\t\tthis.#resources[resourceID] = null\r\n\r\n\t\t\tresource.dispose()\r\n\t\t}\r\n\t}\r\n\r\n\t/** Добавление существующего ресурса */\r\n\tpushResource( resource ) {\r\n\t\tif (!this.#resources[resource.id]) {\r\n\t\t\tthis.#resources[resource.id] = resource\r\n\r\n\t\t\tthis.#resourcesCounter ++\r\n\r\n\t\t\tif (!resource.isLoaded) {\r\n\t\t\t\tthis._addUnloadedResource(resource)\r\n\t\t\t}\r\n\r\n\t\t\treturn resource\r\n\t\t}\r\n\t}\r\n\r\n\t/** @param { string } name */\r\n\tget( name ) {\r\n\t\tlet areLiteralsResolved = true,\r\n\t\t\tfile\r\n\r\n\t\tconst literals = Loader.instance.literals\r\n\r\n\t\t// Замена {lang} на литерал (ru, eng...)\r\n\t\tname = name.replace(/{([^}]*)}/g, ( expression, $1 ) => {\r\n\t\t\tif ($1 in literals) {\r\n\t\t\t\tif ($1 == 'lang') {\r\n\t\t\t\t\tconst lang = literals[$1]\r\n\t\t\t\t\tfile = Loader.instance.findByName(name.replace(/{lang}/g, lang))?.file\r\n\r\n\t\t\t\t\tif (file || lang == 'ru') {\r\n\t\t\t\t\t\treturn lang\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (lang == 'en') {\r\n\t\t\t\t\t\treturn 'ru'\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfile = Loader.instance.findByName(name.replace(/{lang}/g, 'en'))?.file\r\n\r\n\t\t\t\t\treturn file ? 'en' : 'ru'\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treturn literals[$1]\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tconsole.warn('Literal `%s` is not set.', $1)\r\n\t\t\t\tareLiteralsResolved = false\r\n\t\t\t}\r\n\t\t})\r\n\r\n\t\tif (Loader.isWebpSupported && typeof name === 'string' && /\\.(png|jpg)$/.test(name)) {\r\n\t\t\tname = name.replace(/\\.(png|jpg)$/, '.webp')\r\n\t\t}\r\n\r\n\t\tif (areLiteralsResolved) {\r\n\t\t\tconst resource = this.#resources[name]\r\n\r\n\t\t\tif (resource) {\r\n\t\t\t\treturn resource\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null\r\n\t}\r\n\r\n\tconcat( otherCollection ) {\r\n\t\tconst resultCollection = new ResourcesCollection()\r\n\r\n\t\tlet resourceID,\r\n\t\t\tresource\r\n\r\n\t\tconst pushResources = collection => {\r\n\t\t\tconst resources = collection.resources\r\n\r\n\t\t\tfor (resourceID in resources) {\r\n\t\t\t\tresource = resources[resourceID]\r\n\r\n\t\t\t\tif (resource) {\r\n\t\t\t\t\tresultCollection.pushResource(resource)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tpushResources(this)\r\n\t\tpushResources(otherCollection)\r\n\r\n\t\treturn resultCollection\r\n\t}\r\n\r\n\treduce() {\r\n\t\treturn Loader.instance.reduce(this)\r\n\t}\r\n\r\n\t_addUnloadedResource( resource ) {\r\n\t\tconst unloadedResources = this.#unloadedResources\r\n\r\n\t\tunloadedResources.push(resource)\r\n\r\n\t\tresource.once('loaded', () => {\r\n\t\t\tconst resIndex = unloadedResources.indexOf(resource)\r\n\r\n\t\t\tunloadedResources.splice(resIndex, 1)\r\n\r\n\t\t\tif (!unloadedResources.length) {\r\n\t\t\t\tthis.#loadResolver && this.#loadResolver()\r\n\r\n\t\t\t\tthis.emit('loaded', this)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t_processOnProgress( onProgress ) {\r\n\t\tif (!this.#unloadedResources.length) {\r\n\t\t\tonProgress(1, this.#resourcesCounter, this.#resourcesCounter)\r\n\t\t}\r\n\t\telse {\r\n\t\t\tconst unloadedResources = this.#unloadedResources\r\n\r\n\t\t\tlet resource,\r\n\t\t\t\tunloadedCounter,\r\n\t\t\t\tprogress,\r\n\t\t\t\tloadedCounter\r\n\r\n\t\t\t// todo: не учтено, что в unloadedResources могут динамически добавляться элементы\r\n\t\t\tfor (resource of unloadedResources) {\r\n\t\t\t\tresource.once('loaded', () => {\r\n\t\t\t\t\tunloadedCounter = this.#unloadedResources.length\r\n\t\t\t\t\tprogress = Number((1 - unloadedCounter / this.#resourcesCounter).toFixed(2))\r\n\t\t\t\t\tloadedCounter = this.#resourcesCounter - unloadedCounter\r\n\r\n\t\t\t\t\tonProgress(progress, this.#resourcesCounter, loadedCounter)\r\n\t\t\t\t})\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/** Вставка стилей в элемент.\r\n\t * Уже загруженные стили будут вставлены сразу.\r\n\t * Остальные - после их загрузки.\r\n\t */\r\n\tinsertStylesTo( element ) {\r\n\t\tif (!this._el && element) {\r\n\t\t\tthis._el = element\r\n\t\t}\r\n\r\n\t\tconst insertToElement = this._el\r\n\r\n\t\tif (insertToElement) {\r\n\t\t\tthis.forEach(resource => {\r\n\t\t\t\tif (resource.isStyle) {\r\n\t\t\t\t\tif (resource.isLoaded) {\r\n\t\t\t\t\t\tthis._insertStylesToElement(resource.data, insertToElement)\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tresource.once('loaded', () => this._insertStylesToElement(resource.data, insertToElement))\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\tif (IS_DEV) {\r\n\t\t\tif (!insertToElement) {\r\n\t\t\t\tconsole.error('Failed to insert styles. \"element\" is not type of HTMLElement')\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this\r\n\t}\r\n\r\n\t_insertStylesToElement( cssStyle, element ) {\r\n\t\t_.forEach(cssStyle.styles, styleTag => {\r\n\t\t\telement.appendChild(styleTag)\r\n\t\t})\r\n\r\n\t\tif (!cssStyle.isFullReady) {\r\n\t\t\tcssStyle.on('extraStyleCreated', styleTag => {\r\n\t\t\t\telement.appendChild(styleTag)\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\tforEach( callback ) {\r\n\t\tlet resource,\r\n\t\t\tresourceID,\r\n\t\t\tresources = this.#resources\r\n\r\n\t\tfor (resourceID in resources) {\r\n\t\t\tresource = resources[resourceID]\r\n\r\n\t\t\tif (resource) {\r\n\t\t\t\tcallback(resource)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tat( index ) {\r\n\t\tconst keys = Object.keys(this.#resources)\r\n\t\tconst targetKey = keys[index]\r\n\r\n\t\tif (targetKey) {\r\n\t\t\treturn this.#resources[targetKey]\r\n\t\t}\r\n\t}\r\n\r\n\tget data() {\r\n\t\tconst keys = Object.keys(this.#resources)\r\n\r\n\t\treturn this.#resources[keys[0]]?.data\r\n\t}\r\n\r\n\tget _data() {\r\n\t\treturn Object.values(this.#resources)\r\n\t}\r\n\r\n\tget file() {\r\n\t\tconst keys = Object.keys(this.#resources)\r\n\r\n\t\treturn this.#resources[keys[0]]\r\n\t}\r\n\r\n\tget href() {\r\n\t\treturn this.file?.href\r\n\t}\r\n\r\n\tget resources() {\r\n\t\treturn this.#resources\r\n\t}\r\n\r\n\tget unloadedResources() {\r\n\t\treturn this.#unloadedResources\r\n\t}\r\n\r\n\tget isPrioritized() {\r\n\t\treturn this.#isPrioritized\r\n\t}\r\n\r\n\tget resourcesCounter() {\r\n\t\treturn this.#resourcesCounter\r\n\t}\r\n\r\n\tget length() {\r\n\t\treturn this.#resourcesCounter\r\n\t}\r\n\r\n\tget isEmpty() {\r\n\t\treturn this.#resourcesCounter <= 0\r\n\t}\r\n\r\n\tget isLoaded() {\r\n\t\treturn this.#unloadedResources.length <= 0\r\n\t}\r\n}\r\n\r\nexport default ResourcesCollection","import EventTarget from 'eventemitter3'\r\n\r\nclass Request extends EventTarget {\r\n\t/** @returns { Promise } */\r\n\texecute( href, data ) {\r\n\t\tif (Social.isGP) {\r\n\t\t\treturn this._xhr(href, data)\r\n\t\t}\r\n\r\n\t\treturn this._fetch(href, data)\r\n\t}\r\n\r\n\t_xhr( href, data ) {\r\n\t\tconst needRetry = data.needRetry\r\n\t\tconst resource = data.resource\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\ttry {\r\n\t\t\t\tconst request = new XMLHttpRequest()\r\n\r\n\t\t\t\tif (resource.isAudio) {\r\n\t\t\t\t\trequest.responseType = 'arraybuffer'\r\n\t\t\t\t}\r\n\r\n\t\t\t\trequest.open('GET', href, true)\r\n\r\n\t\t\t\trequest.onload = () => {\r\n\t\t\t\t\trequest.onload = request.onerror = request.onabort = request.onprogress = null\r\n\r\n\t\t\t\t\tif (request.status == 200) {\r\n\t\t\t\t\t\tresolve(request.response)\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse if (needRetry) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tthis._xhr(href, needRetry)\r\n\t\t\t\t\t\t\t\t.then(resolve)\r\n\t\t\t\t\t\t\t\t.catch(reject)\r\n\t\t\t\t\t\t}, 500)\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treject(`status: ${request.status},\\nstatusText: ${request.statusText}`)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\trequest.onerror = () => {\r\n\t\t\t\t\trequest.onload = request.onerror = request.onabort = request.onprogress = null\r\n\r\n\t\t\t\t\tif (needRetry) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tthis._xhr(href, needRetry)\r\n\t\t\t\t\t\t\t\t.then(resolve)\r\n\t\t\t\t\t\t\t\t.catch(reject)\r\n\t\t\t\t\t\t}, 500)\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\treject(`status: ${request.status},\\nstatusText: ${request.statusText}`)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// не надо\r\n\t\t\t\t// request.onprogress = event => {\r\n\t\t\t\t// \tif (event && typeof event.loaded == 'number' && typeof event.total == 'number' && event.loaded < event.total) {\r\n\t\t\t\t// \t\tonProgress && onProgress(event.loaded / event.total)\r\n\t\t\t\t// \t}\r\n\t\t\t\t// }\r\n\r\n\t\t\t\trequest.onabort = request.onerror\r\n\r\n\t\t\t\trequest.send()\r\n\t\t\t}\r\n\t\t\tcatch (exception) {\r\n\t\t\t\tconsole.warn(exception)\r\n\r\n\t\t\t\treject(exception.message)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t_fetch( href, data ) {\r\n\t\tconst needRetry = data.needRetry\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tfetch(href)\r\n\t\t\t\t.then(response => response.text())\r\n\t\t\t\t.then(resolve)\r\n\t\t\t\t.catch(e => {\r\n\t\t\t\t\tif (needRetry) {\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tthis._fetch(href, data)\r\n\t\t\t\t\t\t\t\t.then(resolve)\r\n\t\t\t\t\t\t\t\t.catch(reject)\r\n\t\t\t\t\t\t}, 500)\r\n\t\t\t\t\t}\r\n\t\t\t\t})\r\n\t\t})\r\n\t}\r\n}\r\n\r\nexport default Request","class LoadQueue {\r\n\t#resourcesQueue = []\r\n\r\n\t#loadingCounter = 0\r\n\r\n\t#maxLoadTasks\r\n\r\n\t#isPaused = false\r\n\r\n\tconstructor( maxLoadTasks ) {\r\n\t\tthis.#maxLoadTasks = maxLoadTasks\r\n\t}\r\n\r\n\tpush( collection ) {\r\n\t\tthis.#resourcesQueue.unshift(...collection.unloadedResources)\r\n\t}\r\n\r\n\tload( loadCtrl ) {\r\n\t\tif (this.#isPaused) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tlet canLoad = false\r\n\r\n\t\tif (this.#resourcesQueue.length && this.#loadingCounter < this.#maxLoadTasks) {\r\n\t\t\tcanLoad = true\r\n\t\t}\r\n\r\n\t\tif (canLoad) {\r\n\t\t\tconst resource = this.#resourcesQueue.shift()\r\n\r\n\t\t\tif (!(resource.isReduced || resource.isLoading || resource.isLoaded)) {\r\n\t\t\t\tthis.#loadingCounter ++\r\n\r\n\t\t\t\tresource\r\n\t\t\t\t\t.load()\r\n\t\t\t\t\t.finally(() => {\r\n\t\t\t\t\t\tthis.#loadingCounter --\r\n\r\n\t\t\t\t\t\tloadCtrl.load()\r\n\t\t\t\t\t})\r\n\t\t\t}\r\n\r\n\t\t\tif (this.#loadingCounter < this.#maxLoadTasks) {\r\n\t\t\t\tloadCtrl.load()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tpause(loadCtrl) {\r\n\t\tthis.#isPaused = true\r\n\t}\r\n\r\n\tresume(loadCtrl) {\r\n\t\tthis.#isPaused = false\r\n\r\n\t\tthis.load(loadCtrl)\r\n\t}\r\n\r\n\tget loadingCounter() {\r\n\t\treturn this.#loadingCounter\r\n\t}\r\n\r\n\tget canLoad() {\r\n\t\treturn this.loadingCounter < this.#maxLoadTasks && this.#resourcesQueue.length > 0\r\n\t}\r\n}\r\n\r\nexport default LoadQueue","import LoadQueue from './LoadQueue.js'\r\n\r\nclass LoadController {\r\n\t/** @type { LoadQueue } */\r\n\t#backgroundLoad\r\n\t/** @type { LoadQueue } */\r\n\t#priorityLoad\r\n\r\n\t#maxLoadTasks = 10\r\n\r\n\tconstructor() {\r\n\t\tthis._initLoads()\r\n\t}\r\n\r\n\t_initLoads() {\r\n\t\tif (window.navigator?.hardwareConcurrency > this.#maxLoadTasks) {\r\n\t\t\tthis.#maxLoadTasks = window.navigator.hardwareConcurrency\r\n\t\t}\r\n\r\n\t\tthis.#backgroundLoad = new LoadQueue(Math.ceil(this.#maxLoadTasks / 2))\r\n\t\tthis.#priorityLoad = new LoadQueue(this.#maxLoadTasks)\r\n\t}\r\n\r\n\tpush( collection, isPrioritized ) {\r\n\t\tif (isPrioritized) {\r\n\t\t\tthis.#priorityLoad.push(collection)\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.#backgroundLoad.push(collection)\r\n\t\t}\r\n\r\n\t\tthis.load()\r\n\t}\r\n\r\n\tload() {\r\n\t\tconst backgroundLoad = this.#backgroundLoad\r\n\t\tconst priorityLoad = this.#priorityLoad\r\n\r\n\t\tif (backgroundLoad.loadingCounter + priorityLoad.loadingCounter < this.#maxLoadTasks) {\r\n\t\t\tif (priorityLoad.canLoad) {\r\n\t\t\t\tpriorityLoad.load(this)\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tbackgroundLoad.load(this)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tget backgroundLoad() {\r\n\t\treturn this.#backgroundLoad\r\n\t}\r\n}\r\n\r\nexport default LoadController","import Loader from '../Loader.js'\r\nimport ResourcesCollection from '../ResourcesCollection.js'\r\nimport Parser from './Parser.js'\r\n\r\nconst RESOURCE_FIELDS = [ 'tags', 'options', 'hash', 'webp' ]\r\n\r\nclass ManifestParser extends Parser {\r\n\t#loadedManifests = []\r\n\r\n\tload( resource ) {\r\n\t\tconst href = resource.href\r\n\r\n\t\tif (!this.#loadedManifests.includes(href)) {\r\n\t\t\tconsole.log('Loading manifest:', href)\r\n\r\n\t\t\tlet loadResolver\r\n\t\t\tconst loadPromise = new Promise(resolve => { loadResolver = resolve })\r\n\r\n\t\t\tconst tryFetch = async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst response = await Loader.fetchResource(resource)\r\n\r\n\t\t\t\t\t// todo: в редких случаях может прийти неизвесто что и упасть (лог из Sentry)\r\n\t\t\t\t\tconst data = JSON.parse(response)\r\n\r\n\t\t\t\t\tloadResolver(data)\r\n\r\n\t\t\t\t\tthis.#loadedManifests.push(href)\r\n\r\n\t\t\t\t\tif (IS_DEV || TEST_RELEASE) {\r\n\t\t\t\t\t\tif (!Loader.instance.manifestVersion) {\r\n\t\t\t\t\t\t\tLoader.instance.manifestVersion = new Date(data.version)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tcatch {\r\n\t\t\t\t\tsetTimeout(() => tryFetch(), 300)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\ttryFetch()\r\n\r\n\t\t\treturn loadPromise\r\n\t\t}\r\n\t}\r\n\r\n\t__parse( manifest ) {\r\n\t\tconst resources = new ResourcesCollection()\r\n\r\n\t\tlet resourceID,\r\n\t\t\tresourceData\r\n\r\n\t\tfor (resourceID in manifest.resources) {\r\n\t\t\tif (!manifest.isDev) {\r\n\t\t\t\tresourceID = this._formResource(manifest, resourceID)\r\n\t\t\t}\r\n\r\n\t\t\tresourceData = manifest.resources[resourceID]\r\n\r\n\t\t\tif (resourceData.tags && resourceData.tags.indexOf('config') != -1) {\r\n\t\t\t\tresourceData.version = Date.now()\r\n\t\t\t}\r\n\r\n\t\t\tif (Loader.isWebpSupported) {\r\n\t\t\t\tconst webpPath = resourceID.replace(/\\.(png|jpg)$/, '.webp')\r\n\r\n\t\t\t\tif (resourceID !== webpPath) {\r\n\t\t\t\t\t// /img/some.png => /img/some.webp\r\n\t\t\t\t\tconst imageResource = manifest.resources[webpPath] = manifest.resources[resourceID]\r\n\r\n\t\t\t\t\tdelete manifest.resources[resourceID]\r\n\r\n\t\t\t\t\tresourceID = webpPath\r\n\r\n\t\t\t\t\tresourceData.hash = imageResource.webp && imageResource.webp.hash || resourceData.hash\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tconst apkManifest = Loader.instance.apkManifest\r\n\r\n\t\t\tif (apkManifest) {\r\n\t\t\t\tconst apkResourceHash = apkManifest[resourceID]\r\n\t\t\t\tconst resourceHash = resourceData.hash || ''\r\n\r\n\t\t\t\tif (typeof apkResourceHash === 'string' && apkResourceHash == resourceHash) {\r\n\t\t\t\t\tresourceData.isOnTheDevice = true\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tresources.addResource(resourceID, resourceData)\r\n\t\t}\r\n\r\n\t\treturn resources\r\n\t}\r\n\r\n\t_formResource( manifest, filePath ) {\r\n\t\tconst { replaceConfig } = manifest\r\n\r\n\t\tfilePath = this._decodeFilePath(manifest, filePath, replaceConfig.paths)\r\n\r\n\t\tconst resource = manifest.resources[filePath],\r\n\t\t\tcontents = {}\r\n\r\n\t\t// tags\r\n\t\tif (resource.t) {\r\n\t\t\tthis._decodeTags( resource, replaceConfig.tags )\r\n\t\t}\r\n\r\n\t\t// options\r\n\t\tif (resource.o) {\r\n\t\t\tresource.options = resource.o\r\n\r\n\t\t\t// if (resource.o.m) {\r\n\t\t\t// \tresource.options.module = true\r\n\t\t\t// }\r\n\t\t}\r\n\r\n\t\t// hash\r\n\t\tif (resource.h) {\r\n\t\t\tresource.hash = resource.h\r\n\t\t}\r\n\r\n\t\t// webp\r\n\t\tif (resource.w) {\r\n\t\t\tresource.webp = resource.w\r\n\r\n\t\t\tif (resource.w.h) {\r\n\t\t\t\tresource.webp.hash = resource.w.h\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (const key of RESOURCE_FIELDS) {\r\n\t\t\tif (resource[key]) {\r\n\t\t\t\tcontents[key] = resource[key]\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (resource.webp && resource.webp.hash) {\r\n\t\t\tcontents.webp = { hash: resource.webp.hash }\r\n\t\t}\r\n\r\n\t\t// if (resource.options && resource.options.module) {\r\n\t\t// \tcontents.options.module = resource.options.module\r\n\t\t// }\r\n\r\n\t\t// if (resource.dependencies) {\r\n\t\t// \tcontents.dependencies = resource.dependencies\r\n\t\t// }\r\n\r\n\t\tmanifest.resources[filePath] = contents\r\n\r\n\t\treturn filePath\r\n\t}\r\n\r\n\t_decodeTags( resource, replaceConfig ) {\r\n\t\tif (resource) {\r\n\t\t\tconst newTags = []\r\n\r\n\t\t\tfor (const tag of resource.t) {\r\n\t\t\t\tif (replaceConfig[tag]) {\r\n\t\t\t\t\tnewTags.push(replaceConfig[tag])\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tnewTags.push(tag)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tresource.tags = newTags\r\n\t\t}\r\n\t}\r\n\r\n\t_decodeFilePath( manifest, filePath, replaceConfig ) {\r\n\t\tconst oldFilePath = filePath\r\n\r\n\t\t// Путь минифицирован\r\n\t\tconst parts = filePath.split('/')\r\n\t\tconst encodedPart = parts[0]\r\n\r\n\t\tif (replaceConfig[encodedPart]) {\r\n\t\t\tconst fileName = parts[parts.length - 1]\r\n\r\n\t\t\tfilePath = `${ replaceConfig[encodedPart] }/${ fileName }`\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthrow new Error('Failed to decode substring for manifest.')\r\n\t\t}\r\n\r\n\t\tif (filePath != oldFilePath) {\r\n\t\t\tmanifest.resources[filePath] = manifest.resources[oldFilePath]\r\n\r\n\t\t\tdelete manifest.resources[oldFilePath]\r\n\t\t}\r\n\r\n\t\treturn filePath\r\n\t}\r\n}\r\n\r\nexport default ManifestParser","import Parser from './Parser.js'\r\n\r\nclass JSONParser extends Parser {\r\n\t__parse( content, resource ) {\r\n\t\tconst json = JSON.parse(content)\r\n\r\n\t\tif (resource.tags?.includes('vocabulary')) {\r\n\t\t\tapp.language.appendVocabulary(json)\r\n\t\t}\r\n\r\n\t\treturn json\r\n\t}\r\n}\r\n\r\nexport default JSONParser","export const HASHED_CSS = {\r\n\t'A': 'margin',\r\n\t'B': 'animation',\r\n\t'C': 'position',\r\n\t'D': 'display',\r\n\t'E': 'width',\r\n\t'F': 'height',\r\n\t'G': 'background-repeat',\r\n\t'H': 'cursor',\r\n\t'I': 'background-size',\r\n\t'J': 'background-position',\r\n\t'K': 'pointer-events',\r\n\t'L': 'background-image',\r\n\t'M': 'left',\r\n\t'N': 'top',\r\n\t'O': 'transform-origin',\r\n\t'P': 'transform',\r\n\t'Q': 'content',\r\n\t'R': 'overflow',\r\n\t'S': 'border-radius',\r\n\t'T': 'background-color',\r\n\t'U': 'right',\r\n\t'V': 'bottom',\r\n\t'W': 'background',\r\n\t'X': 'opacity',\r\n\t'Y': 'animation-delay',\r\n\t'Z': 'background-position-y',\r\n\t'a': 'background-position-x',\r\n\t'b': 'font-family',\r\n\t'c': 'transition',\r\n\t'd': 'text-align',\r\n\t'e': 'box-shadow',\r\n\t'f': 'z-index',\r\n\t'g': 'margin-right',\r\n\t'h': 'margin-top',\r\n\t'i': 'visibility',\r\n\t'j': 'justify-content',\r\n\t'k': 'flex-wrap',\r\n\t'l': 'flex-direction',\r\n\t'm': 'align-content',\r\n\t'n': 'padding',\r\n\t'o': 'border',\r\n\t'p': 'border-bottom',\r\n\t'q': 'line-height',\r\n\t'r': 'color',\r\n\t's': 'font-size',\r\n\t't': 'padding-left',\r\n\t'u': 'padding-top',\r\n\t'v': 'box-sizing',\r\n\t'w': 'animation-duration',\r\n\t'x': 'animation-fill-mode',\r\n\t'y': 'animation-name',\r\n\t'z': 'text-shadow',\r\n\t'BA': 'align-items',\r\n\t'BB': 'text-overflow',\r\n\t'BC': 'white-space',\r\n\t'BD': 'vertical-align',\r\n\t'BE': 'margin-left',\r\n\t'BF': 'border-color',\r\n\t'BG': 'border-style',\r\n\t'BH': 'border-width',\r\n\t'BI': '-webkit-filter',\r\n\t'BJ': 'filter',\r\n\t'BK': 'margin-bottom',\r\n\t'BL': 'letter-spacing',\r\n\t'BM': 'transition-duration',\r\n\t'BN': 'flex-shrink',\r\n\t'BO': 'inset',\r\n\t'BP': 'padding-right',\r\n\t'BQ': 'background-origin',\r\n\t'BR': 'background-clip',\r\n\t'BS': 'font-weight',\r\n\t'BT': '-webkit-backface-visibility',\r\n\t'BU': 'backface-visibility',\r\n\t'BV': '-webkit-mask-image',\r\n\t'BW': 'mask-image',\r\n\t'BX': '-webkit-mask-size',\r\n\t'BY': 'mask-size',\r\n\t'BZ': '-webkit-mask-position',\r\n\t'Ba': 'mask-position',\r\n\t'Bb': '-webkit-mask-repeat',\r\n\t'Bc': 'mask-repeat',\r\n\t'Bd': 'font',\r\n\t'Be': 'outline',\r\n\t'Bf': 'user-select',\r\n\t'Bg': 'touch-action',\r\n\t'Bh': '-webkit-user-select',\r\n\t'Bi': '-moz-user-select',\r\n\t'Bj': '-ms-user-select',\r\n\t'Bk': '-webkit-tap-highlight-color',\r\n\t'Bl': '-webkit-focus-ring-color',\r\n\t'Bm': 'max-width',\r\n\t'Bn': 'max-height',\r\n\t'Bo': 'list-style',\r\n\t'Bp': '-webkit-touch-callout',\r\n\t'Bq': 'border-top',\r\n\t'Br': 'border-bottom-width',\r\n\t'Bs': 'transition-delay',\r\n\t'Bt': 'transform-style',\r\n\t'Bu': 'min-width',\r\n\t'Bv': 'border-top-width',\r\n\t'Bw': 'text-decoration',\r\n\t'Bx': 'border-left',\r\n\t'By': 'border-top-left-radius',\r\n\t'Bz': 'border-bottom-left-radius',\r\n\t'CA': 'font-style',\r\n\t'CB': 'padding-bottom',\r\n\t'CC': 'text-transform',\r\n\t'CD': 'order',\r\n\t'CE': '-o-border-radius',\r\n\t'CF': '-ms-border-radius',\r\n\t'CG': '-webkit-border-radius',\r\n\t'CH': '-moz-border-radius',\r\n\t'CI': '-o-transform-origin',\r\n\t'CJ': '-ms-transform-origin',\r\n\t'CK': '-webkit-transform-origin',\r\n\t'CL': '-moz-transform-origin',\r\n\t'CM': '-o-animation',\r\n\t'CN': '-ms-animation',\r\n\t'CO': '-webkit-animation',\r\n\t'CP': '-moz-animation',\r\n\t'CQ': 'min-height',\r\n\t'CR': 'animation-play-state',\r\n\t'CS': 'perspective',\r\n\t'CT': 'align-self',\r\n\t'CU': 'animation-timing-function',\r\n\t'CV': 'border-top-right-radius',\r\n\t'CW': 'border-bottom-right-radius',\r\n\t'CX': 'table-layout',\r\n\t'CY': 'text-indent',\r\n\t'CZ': 'flex-grow',\r\n\t'Ca': 'list-style-type',\r\n\t'Cb': 'fill',\r\n\t'Cc': 'animation-iteration-count',\r\n\t'Cd': 'flex-basis',\r\n\t'Ce': 'transition-property',\r\n\t'Cf': 'transition-timing-function',\r\n\t'Cg': '-webkit-text-decoration-skip-ink',\r\n\t'Ch': 'text-decoration-skip-ink',\r\n\t'Ci': 'resize',\r\n\t'Cj': 'overflow-y',\r\n\t'Ck': 'animation-direction',\r\n\t'Cl': 'float',\r\n\t'Cm': 'will-change',\r\n\t'Cn': '-webkit-mask',\r\n\t'Co': 'mask'\r\n}","import { HASHED_CSS } from '@zebomba/hashedCSS.js'\r\nimport Loader from '../../Loader.js'\r\nimport EventTarget from 'eventemitter3'\r\n\r\nconst reservedNames = {\r\n\tdefault: 'default',\r\n\tkeyframes: 'keyframes',\r\n\tkeyframesSelector: '@keyframes',\r\n\turlStart: 'url(',\r\n\tjpg: '.jpg',\r\n\tsvg: '.svg',\r\n\tpng: '.png'\r\n}\r\n\r\nclass CSSStyle extends EventTarget {\r\n\t/** @typedef { [ \"default\", string, Array<[ false, string, string ] | [ true, string ]> ] } DefaultCSSFragment */\r\n\t/** @typedef { [ \"keyframes\", string, Array<[ string, Array<[ false, string, string ] | [ true, string ]> ]> ] } KeyframesCSSFragment */\r\n\t/** @typedef { [ \"fontface\", string, Array<[ false, string, string ] | [ true, string ]> ] } FontfaceCSSFragment */\r\n\t/** @typedef { DefaultCSSFragment | KeyframesCSSFragment | FontfaceCSSFragment } CSSFragment */\r\n\r\n\t/** @typedef { { type: \"default\", key: string, properties: Array<[ string, string ]> } } ResourceDependantDefaultFragment */\r\n\t/** @typedef { { type: \"keyframes\", key: string, properties: Array<[ string, Array<[ string, string ]> ]> } } ResourceDependantKeyframesFragment */\r\n\t/** @typedef { { type: \"fontface\", key: string, properties: Array<[ string, string ]> } } ResourceDependantFontfaceFragment */\r\n\t/** @typedef { ResourceDependantDefaultFragment | ResourceDependantKeyframesFragment | ResourceDependantFontfaceFragment } ResourceDependantFragment */\r\n\r\n\t/**\r\n\t * @param {string } cssText\r\n\t * @param { string } name\r\n\t */\r\n\r\n\t#isParsed = false\r\n\r\n\t#cssText\r\n\r\n\tconstructor( cssText, name ) {\r\n\t\tsuper()\r\n\r\n\t\tthis._isCommited = false\r\n\r\n\t\t/** @type { CSSFragment[] } */\r\n\t\tthis._fragments = []\r\n\t\tthis._name = name\r\n\r\n\t\t/** @type {{ [resourceName: string]: Array<{ key: string, propertyName: string, propertyValue: string }> }} */\r\n\t\tthis._resourceDependantFragments = {}\r\n\r\n\t\t/** @type { { [resourceName: string]: ResourceDependantFragment[] } } */\r\n\t\tthis._resourcesDependantFragments = {}\r\n\r\n\t\tthis._fragmentsTexts\r\n\r\n\t\tthis.#cssText = cssText\r\n\r\n\t\tthis._styleTag = document.createElement('style')\r\n\t}\r\n\r\n\tcommit() {\r\n\t\tif (this._isCommited) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tlet mainFragmentText = '',\r\n\t\t\ti\r\n\r\n\t\tconst fragmentsLength = this._fragments.length\r\n\r\n\t\tfor (i = 0; i < fragmentsLength; i ++) {\r\n\t\t\tconst fragment = this._fragments[i]\r\n\t\t\tconst key = fragment[1]\r\n\r\n\t\t\tif (fragment[0] === reservedNames.default) {\r\n\t\t\t\tconst properties = fragment[2]\r\n\t\t\t\tlet fragmentText = ''\r\n\r\n\t\t\t\tfor (let j = 0; j < properties.length; j ++) {\r\n\t\t\t\t\tconst property = properties[j]\r\n\r\n\t\t\t\t\tif (property[0]) {\r\n\t\t\t\t\t\tfragmentText += property[1]\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tconst propertyName = property[1]\r\n\t\t\t\t\t\tlet propertyValue = property[2]\r\n\t\t\t\t\t\tconst isURL = propertyValue.indexOf(reservedNames.urlStart) != -1\r\n\r\n\t\t\t\t\t\tif (isURL) {\r\n\t\t\t\t\t\t\tconst resources = this.getUnresolvedResources(propertyValue)\r\n\r\n\t\t\t\t\t\t\tif (Loader.isWebpSupported) {\r\n\t\t\t\t\t\t\t\tpropertyValue = propertyValue.replace(/\\.(png|jpg)\\)/g, '.webp)')\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (resources.length) {\r\n\t\t\t\t\t\t\t\tfor (let k = 0; k < resources.length; k ++) {\r\n\t\t\t\t\t\t\t\t\tthis._resourcesDependantFragments[resources[k].name] = this._resourcesDependantFragments[resources[k].name] || []\r\n\r\n\t\t\t\t\t\t\t\t\t/** @type { ResourceDependantDefaultFragment } */\r\n\t\t\t\t\t\t\t\t\tconst resourcesDependantFragment = {\r\n\t\t\t\t\t\t\t\t\t\ttype: reservedNames.default,\r\n\t\t\t\t\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\t\t\t\t\tproperties: [ [ propertyName, propertyValue ] ]\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\tthis._resourcesDependantFragments[resources[k].name].push(resourcesDependantFragment)\r\n\r\n\t\t\t\t\t\t\t\t\tresources[k].once('loaded', () => this.commitFragment(resources[k].name))\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tfragmentText += `${propertyName}:${this.resolveResourcesNames(propertyValue)};`\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tfragmentText += `${propertyName}:${propertyValue};`\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (fragmentText) {\r\n\t\t\t\t\tmainFragmentText += `${key}{${fragmentText}}`\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse if (fragment[0] === reservedNames.keyframes) {\r\n\t\t\t\tconst keyframes = fragment[2]\r\n\t\t\t\tlet fragmentText = ''\r\n\r\n\t\t\t\tfor (let j = 0; j < keyframes.length; j ++) {\r\n\t\t\t\t\tconst progressKey = keyframes[j][0]\r\n\t\t\t\t\tconst properties = keyframes[j][1]\r\n\r\n\t\t\t\t\tfragmentText += `${progressKey}{`\r\n\r\n\t\t\t\t\tfor (let k = 0; k < properties.length; k ++) {\r\n\t\t\t\t\t\tconst property = properties[k]\r\n\r\n\t\t\t\t\t\tif (property[0]) {\r\n\t\t\t\t\t\t\tfragmentText += property[1]\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tfragmentText += `${property[1]}:${property[2]};`\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tfragmentText += '}'\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (fragmentText) {\r\n\t\t\t\t\tmainFragmentText += `${key}{${fragmentText}}`\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (mainFragmentText) {\r\n\t\t\tmainFragmentText += `\\n/*# sourceURL=${self.location.origin}${this._name} */`\r\n\r\n\t\t\tthis._styleTag.textContent = mainFragmentText\r\n\t\t\tthis._styleTag.setAttribute('data-src', this._name)\r\n\t\t}\r\n\r\n\t\tthis._fragments = null\r\n\t\tthis._isCommited = true\r\n\t}\r\n\r\n\t/** @param { string } resourceName */\r\n\tcommitFragment( resourceName ) {\r\n\t\tif (resourceName in this._resourcesDependantFragments) {\r\n\t\t\tconst fragments = this._resourcesDependantFragments[resourceName]\r\n\t\t\tlet fragmentsText = ''\r\n\r\n\t\t\tfor (const fragment of fragments) {\r\n\t\t\t\tlet fragmentText = ''\r\n\r\n\t\t\t\tif (fragment.type === reservedNames.default) {\r\n\t\t\t\t\tfor (const [ propertyName, propertyValue ] of fragment.properties) {\r\n\t\t\t\t\t\tconst unresolvedResources = this.getUnresolvedResources(propertyValue)\r\n\r\n\t\t\t\t\t\tif (!unresolvedResources.length) {\r\n\t\t\t\t\t\t\tfragmentText += `${propertyName}:${this.resolveResourcesNames(propertyValue)};`\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (fragmentText) {\r\n\t\t\t\t\tfragmentsText += `${fragment.key}{${fragmentText}}`\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (fragmentsText) {\r\n\t\t\t\tif (!CSSStyle.isNativeStyleSheetSupported || !this._styleSheet) {\r\n\t\t\t\t\tif (!this._fragmentsTexts) {\r\n\t\t\t\t\t\tthis._fragmentsTexts = []\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst style = document.createElement('style')\r\n\t\t\t\t\tstyle.textContent = fragmentsText\r\n\r\n\t\t\t\t\tthis.emit('extraStyleCreated', style)\r\n\r\n\t\t\t\t\tthis._fragmentsTexts.push(fragmentsText)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tthis._resourcesDependantFragments[resourceName].length = 0\r\n\t\t\tdelete this._resourcesDependantFragments[resourceName]\r\n\t\t}\r\n\t}\r\n\r\n\t/** @param { string } cssText */\r\n\t_parse( cssText ) {\r\n\t\tlet key = ''\r\n\t\tlet value = ''\r\n\t\tlet char = ''\r\n\t\tlet prevChar = ''\r\n\t\tlet nextChar = ''\r\n\t\tlet depth = 0\r\n\t\tlet isReadingKey = true\r\n\t\tlet isReadingComment = false\r\n\t\tlet isEscapedSequence = false\r\n\t\tlet escapeChar = ''\r\n\r\n\t\tconst cssTextLength = cssText.length\r\n\r\n\t\tfor (let i = 0; i < cssTextLength; i ++) {\r\n\t\t\tchar = cssText[i]\r\n\t\t\tprevChar = cssText[i - 1]\r\n\t\t\tnextChar = cssText[i + 1]\r\n\r\n\t\t\tif (!isEscapedSequence) {\r\n\t\t\t\tif (char === '/' && nextChar === '*') {\r\n\t\t\t\t\tisReadingComment = true\r\n\t\t\t\t}\r\n\t\t\t\telse if (prevChar === '*' && char === '/') {\r\n\t\t\t\t\tisReadingComment = false\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tcontinue\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isReadingComment && isReadingKey) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tswitch (char) {\r\n\t\t\tcase '{':\r\n\t\t\t\tif (!depth) {\r\n\t\t\t\t\tisReadingKey = false\r\n\t\t\t\t\tvalue = ''\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tkey += char\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalue += char\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdepth ++\r\n\t\t\t\tbreak\r\n\t\t\tcase '}':\r\n\t\t\t\tdepth --\r\n\r\n\t\t\t\tif (!depth) {\r\n\t\t\t\t\tkey = key\r\n\t\t\t\t\t\t.replace(/\\r/g, '\\n')\r\n\t\t\t\t\t\t.replace(/\\n{2,}/g, '\\n')\r\n\t\t\t\t\t\t.replace(/\\t/g, ' ')\r\n\t\t\t\t\t\t.replace(/ {2,}/g, ' ')\r\n\t\t\t\t\t\t.trim()\r\n\r\n\t\t\t\t\tvalue = value.trim()\r\n\r\n\t\t\t\t\tif (key.indexOf(reservedNames.keyframesSelector) != -1) {\r\n\t\t\t\t\t\tthis._fragments.push([ reservedNames.keyframes, key, this._parseKeyframes(value) ])\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tthis._fragments.push([ reservedNames.default, key, this._parseProperties(value) ])\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tisReadingKey = true\r\n\t\t\t\t\tkey = ''\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tkey += char\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalue += char\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\tkey += char\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvalue += char\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (char === '\\'' || char === '\"') {\r\n\t\t\t\tif (isEscapedSequence) {\r\n\t\t\t\t\tif (escapeChar === char) {\r\n\t\t\t\t\t\tisEscapedSequence = false\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tisEscapedSequence = true\r\n\t\t\t\t\tescapeChar = char\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tthis.#isParsed = true\r\n\t}\r\n\r\n\t/** @param { ( key: string ) => string } getText */\r\n\ttranslate( getText ) {\r\n\t\tif (!this._isCommited) {\r\n\t\t\tconst fragmentsLength = this._fragments.length\r\n\r\n\t\t\tfor (let i = 0; i < fragmentsLength; i ++) {\r\n\t\t\t\tconst fragment = this._fragments[i]\r\n\r\n\t\t\t\tif (fragment[0] === reservedNames.default) {\r\n\t\t\t\t\tconst properties = fragment[2]\r\n\r\n\t\t\t\t\tfor (let j = 0; j < properties.length; j ++) {\r\n\t\t\t\t\t\tconst property = properties[j]\r\n\r\n\t\t\t\t\t\tif (!property[0]) {\r\n\t\t\t\t\t\t\tproperty[2] = property[2].replace(CSSStyle.vocabularyRegEx, ( expression, $1, $2 ) => {\r\n\t\t\t\t\t\t\t\tif ($1) {\r\n\t\t\t\t\t\t\t\t\treturn getText($1)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if ($2) {\r\n\t\t\t\t\t\t\t\t\treturn getText($2)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\treturn ''\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @param { string } propertyValue\r\n\t * @returns { __Resource__[] }\r\n\t */\r\n\tgetUnresolvedResources( propertyValue ) {\r\n\t\tconst unresolvedResources = []\r\n\r\n\t\tif (CSSStyle.isNativeStyleSheetSupported) {\r\n\t\t\tpropertyValue.replace(/url\\(([^)]+)\\)/g, ( $0, $1 ) => {\r\n\t\t\t\tlet resourceName = $1\r\n\r\n\t\t\t\tif (Loader.isWebpSupported) {\r\n\t\t\t\t\tresourceName = resourceName.replace(/\\.(png|jpg)$/, '.webp')\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst resource = Loader.instance.get(resourceName)\r\n\r\n\t\t\t\tif (resource && !resource.isLoaded) {\r\n\t\t\t\t\tunresolvedResources.push(resource)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\treturn unresolvedResources\r\n\t}\r\n\r\n\t/** @param { string } propertyValue */\r\n\tresolveResourcesNames( propertyValue ) {\r\n\t\treturn propertyValue.replace(/url\\(([^)]+)\\)/g, ( $0, $1 ) => {\r\n\t\t\tconst resourceName = $1\r\n\r\n\t\t\tconst resource = Loader.instance.get(resourceName)\r\n\r\n\t\t\tif (resource) {\r\n\t\t\t\tif (resource.isLoaded || !CSSStyle.isNativeStyleSheetSupported) {\r\n\t\t\t\t\treturn `url(${resource.href})`\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tthrow new Error(`Failed to execute 'resolveResourcesNames' on 'CSSStyle': resource '${resource.name}' is not yet loaded.`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\treturn `url(${$1})`\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * @param { string } propertyText\r\n\t * @returns { Array<[ false, string, string ] | [ true, string ]> }\r\n\t */\r\n\t_parseProperties( propertyText ) {\r\n\t\tlet properties = []\r\n\t\tlet key = ''\r\n\t\tlet value = ''\r\n\t\tlet comment = ''\r\n\t\tlet char = ''\r\n\t\tlet prevChar = ''\r\n\t\tlet nextChar = ''\r\n\t\tlet isReadingKey = true\r\n\t\tlet isReadingComment = false\r\n\t\tlet isEscapedSequence = false\r\n\t\tlet escapeChar = ''\r\n\r\n\t\tfor (let i = 0; i < propertyText.length; i ++) {\r\n\t\t\tchar = propertyText[i]\r\n\t\t\tprevChar = propertyText[i - 1]\r\n\t\t\tnextChar = propertyText[i + 1]\r\n\r\n\t\t\tif (char === '/' && nextChar === '*') {\r\n\t\t\t\tisReadingComment = true\r\n\t\t\t\tcomment = ''\r\n\t\t\t}\r\n\t\t\telse if (prevChar === '*' && char === '/') {\r\n\t\t\t\tisReadingComment = false\r\n\t\t\t\tcomment += char\r\n\t\t\t\tproperties.push([ true, comment ])\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tif (isReadingComment) {\r\n\t\t\t\tcomment += char\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tswitch (char) {\r\n\t\t\tcase ':':\r\n\t\t\t\tif (isEscapedSequence) {\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tkey += char\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalue += char\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tisReadingKey = false\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\tcase ';':\r\n\t\t\t\tif (!isEscapedSequence) {\r\n\t\t\t\t\t// Свойство CSS\r\n\t\t\t\t\tkey = HASHED_CSS[key.trim()] || key.trim()\r\n\r\n\t\t\t\t\tvalue = this._getPropertyValue(value)\r\n\r\n\t\t\t\t\tproperties.push([ false, key, value ])\r\n\r\n\t\t\t\t\tisReadingKey = true\r\n\t\t\t\t\tkey = ''\r\n\t\t\t\t\tvalue = ''\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\tkey += char\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvalue += char\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (char === '\\'' || char === '\"') {\r\n\t\t\t\tif (isEscapedSequence) {\r\n\t\t\t\t\tif (escapeChar === char) {\r\n\t\t\t\t\t\tisEscapedSequence = false\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tisEscapedSequence = true\r\n\t\t\t\t\tescapeChar = char\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (value) {\r\n\t\t\t// Свойство CSS\r\n\t\t\tkey = HASHED_CSS[key.trim()] || key.trim()\r\n\r\n\t\t\t// Значение свойства\r\n\t\t\tvalue = this._getPropertyValue(value)\r\n\r\n\t\t\tproperties.push([ false, key, value ])\r\n\t\t}\r\n\r\n\t\treturn properties\r\n\t}\r\n\r\n\t_getPropertyValue( value ) {\r\n\t\tvalue = value.trim()\r\n\r\n\t\tif (value.indexOf(reservedNames.urlStart) != -1) {\r\n\t\t\tvalue = value.replace(/url\\((.+?)\\)/g, (a, path, c, d) => {\r\n\t\t\t\tpath = `/img/${ path }`\r\n\r\n\t\t\t\tif (!(path.indexOf(reservedNames.jpg) != -1 || path.indexOf(reservedNames.svg) != -1)) {\r\n\t\t\t\t\tpath += reservedNames.png\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn `url(${ path })`\r\n\t\t\t})\r\n\t\t}\r\n\r\n\t\treturn value\r\n\t}\r\n\r\n\t/**\r\n\t * @param { string } keyframesText\r\n\t * @returns { Array<[ string, Array.<[ false, string, string ] | [ true, string ]> ]> }\r\n\t */\r\n\t_parseKeyframes( keyframesText ) {\r\n\t\tlet key = ''\r\n\t\tlet value = ''\r\n\t\tlet char = ''\r\n\t\tlet prevChar = ''\r\n\t\tlet nextChar = ''\r\n\t\tlet depth = 0\r\n\t\tlet isReadingKey = true\r\n\t\tlet isReadingComment = false\r\n\t\tlet isEscapedSequence = false\r\n\t\tlet escapeChar = ''\r\n\t\tlet keyframes = []\r\n\r\n\t\tfor (let i = 0; i < keyframesText.length; i ++) {\r\n\t\t\tchar = keyframesText[i]\r\n\t\t\tprevChar = keyframesText[i - 1]\r\n\t\t\tnextChar = keyframesText[i + 1]\r\n\r\n\t\t\tif (!isEscapedSequence) {\r\n\t\t\t\tif (char === '/' && nextChar === '*') {\r\n\t\t\t\t\tisReadingComment = true\r\n\t\t\t\t}\r\n\t\t\t\telse if (prevChar === '*' && char === '/') {\r\n\t\t\t\t\tisReadingComment = false\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tcontinue\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (isReadingComment && isReadingKey) {\r\n\t\t\t\tcontinue\r\n\t\t\t}\r\n\r\n\t\t\tswitch (char) {\r\n\t\t\tcase '{':\r\n\t\t\t\tif (!depth) {\r\n\t\t\t\t\tisReadingKey = false\r\n\t\t\t\t\tvalue = ''\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tkey += char\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalue += char\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tdepth ++\r\n\t\t\t\tbreak\r\n\t\t\tcase '}':\r\n\t\t\t\tdepth --\r\n\r\n\t\t\t\tif (!depth) {\r\n\t\t\t\t\tkey = key\r\n\t\t\t\t\t\t.replace(/\\r/g, ' ')\r\n\t\t\t\t\t\t.replace(/\\n/g, ' ')\r\n\t\t\t\t\t\t.replace(/\\t/g, ' ')\r\n\t\t\t\t\t\t.replace(/ {2,}/g, ' ')\r\n\t\t\t\t\t\t.trim()\r\n\r\n\t\t\t\t\tvalue = value.trim()\r\n\r\n\t\t\t\t\tkeyframes.push([ key, this._parseProperties(value) ])\r\n\r\n\t\t\t\t\tisReadingKey = true\r\n\t\t\t\t\tkey = ''\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\t\tkey += char\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\tvalue += char\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\tdefault:\r\n\t\t\t\tif (isReadingKey) {\r\n\t\t\t\t\tkey += char\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tvalue += char\r\n\t\t\t\t}\r\n\t\t\t\tbreak\r\n\t\t\t}\r\n\r\n\t\t\tif (char === '\\'' || char === '\"') {\r\n\t\t\t\tif (isEscapedSequence) {\r\n\t\t\t\t\tif (escapeChar === char) {\r\n\t\t\t\t\t\tisEscapedSequence = false\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tisEscapedSequence = true\r\n\t\t\t\t\tescapeChar = char\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn keyframes\r\n\t}\r\n\r\n\tstatic vocabularyRegEx = /data-vocabulary-key\\('([^']+)'\\)|data-vocabulary-key\\(\"([^\"]+)\"\\)/\r\n\r\n\t/**\r\n\t * @param { string } propertyValue\r\n\t * @returns { string[] }\r\n\t */\r\n\tstatic getResourcesNames( propertyValue ) {\r\n\t\tlet names = []\r\n\r\n\t\tpropertyValue.replace(/url\\([^)]+\\)/g, value => {\r\n\t\t\tnames.push(value\r\n\t\t\t\t.trim()\r\n\t\t\t\t.replace(/^'|'$|^\"|\"$/g, ''))\r\n\t\t})\r\n\r\n\t\treturn names\r\n\t}\r\n\r\n\tstatic isNativeStyleSheetSupported = (() => {\r\n\t\tif (typeof window.StyleSheetList === 'function' && document.styleSheets instanceof StyleSheetList) {\r\n\t\t\tif (typeof window.CSSStyleSheet === 'function' && typeof window.CSSStyleSheet.prototype.insertRule === 'function') {\r\n\t\t\t\treturn true\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false\r\n\t})()\r\n\r\n\tget styles() {\r\n\t\t// Парсить CSS первый раз только тогда, когда происходит вставка стилей в элемент\r\n\t\tif (!this.#isParsed && this.#cssText) {\r\n\t\t\tthis._parse(this.#cssText)\r\n\r\n\t\t\tconst getText = app.language.getText.bind(app.language)\r\n\r\n\t\t\tthis.translate(getText)\r\n\t\t\tthis.commit()\r\n\r\n\t\t\tthis.#cssText = null\r\n\t\t}\r\n\r\n\t\tlet fragmentsStyleTag\r\n\r\n\t\t// Все фрагменты определены и уже хранятся одной строкой\r\n\t\tif (this._allFragmentsAsText) {\r\n\t\t\tfragmentsStyleTag = document.createElement('style')\r\n\t\t\tfragmentsStyleTag.textContent = this._allFragmentsAsText\r\n\t\t}\r\n\t\t// Если есть фрагменты\r\n\t\telse if (this._fragmentsTexts) {\r\n\t\t\tfragmentsStyleTag = document.createElement('style')\r\n\t\t\tconst allFragmentsAsText = this._fragmentsTexts.join('')\r\n\t\t\tfragmentsStyleTag.textContent = allFragmentsAsText\r\n\r\n\t\t\t// Все фрагменты загружены, объединяем в одну строку, чтобы в дальнейшем не вызывать каждый раз join\r\n\t\t\tif (!this._resourcesDependantFragments) {\r\n\t\t\t\tthis._fragmentsTexts = null\r\n\t\t\t\tthis._allFragmentsAsText = allFragmentsAsText\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tconst stylesMap = [ this._styleTag.cloneNode(true) ]\r\n\r\n\t\tif (fragmentsStyleTag) {\r\n\t\t\tstylesMap.push(fragmentsStyleTag)\r\n\t\t}\r\n\r\n\t\treturn stylesMap\r\n\t}\r\n\r\n\tget isFullReady() {\r\n\t\treturn _.isEmpty(this._resourcesDependantFragments)\r\n\t}\r\n}\r\n\r\nexport default CSSStyle","import Parser from './Parser.js'\r\nimport CSSStyle from './cssParser/CSSStyle.js'\r\n\r\nclass CSSParser extends Parser {\r\n\t#styles = []\r\n\r\n\t__parse( content, resource ) {\r\n\t\ttry {\r\n\t\t\tconst cssStyle = new CSSStyle(content, resource.id)\r\n\r\n\t\t\tthis.#styles.push(cssStyle)\r\n\r\n\t\t\treturn cssStyle\r\n\t\t}\r\n\t\tcatch (exception) {\r\n\t\t\tconsole.error(exception)\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default CSSParser","import Parser from './Parser.js'\r\nimport Loader from '../Loader.js'\r\n\r\nclass ImageParser extends Parser {\r\n\tload( resource ) {\r\n\t\tif (IS_VILLALIKE) {\r\n\t\t\tif (resource.isPixi) {\r\n\t\t\t\treturn Loader.pixiLoader.add(resource.name, resource.href)\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this._load(resource)\r\n\t}\r\n\r\n\t_load( resource, needRetry = true ) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst image = new Image()\r\n\r\n\t\t\timage.onload = () => {\r\n\t\t\t\timage.onload = image.onerror = null\r\n\r\n\t\t\t\tresolve(image)\r\n\t\t\t}\r\n\r\n\t\t\timage.onerror = e => {\r\n\t\t\t\timage.onload = image.onerror = null\r\n\r\n\t\t\t\tif (needRetry) {\r\n\t\t\t\t\t// Пробуем загрузить повторно всего 1 раз\r\n\t\t\t\t\tthis._load(resource, false)\r\n\t\t\t\t\t\t.then(resolve)\r\n\t\t\t\t\t\t.catch(reject)\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\treject(`Failed to load the image: ${ e?.target.src }`)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\timage.src = resource.href\r\n\t\t})\r\n\t}\r\n\r\n\t// не нужно\r\n\t// _loadSVG() {\r\n\t// \tconst image = new Image\r\n\r\n\t// \timage.onload = () => {\r\n\t// \t\tloader._canvasElement.width = image.width\r\n\t// \t\tloader._canvasElement.height = image.height\r\n\t// \t\tloader._canvasContext.clearRect(0, 0, image.width, image.height)\r\n\t// \t\tloader._canvasContext.drawImage(image, 0, 0)\r\n\r\n\t// \t\ttry {\r\n\t// \t\t\tconst binaryString = atob(loader._canvasElement\r\n\t// \t\t\t\t.toDataURL('image/png')\r\n\t// \t\t\t\t.replace('data:image/png;base64,', ''))\r\n\r\n\t// \t\t\tconst uint8array = new Uint8Array(binaryString.length)\r\n\r\n\t// \t\t\tfor (let i = 0; i < binaryString.length; i ++) {\r\n\t// \t\t\t\tuint8array[i] = binaryString.charCodeAt(i)\r\n\t// \t\t\t}\r\n\r\n\t// \t\t\tfile.href = URL.createObjectURL(new Blob([ uint8array ], { type: 'image/png' }))\r\n\t// \t\t}\r\n\t// \t\tcatch (exception) { warn(exception) }\r\n\r\n\t// \t\tonSuccess()\r\n\t// \t}\r\n\t// \timage.onerror = () => {\r\n\t// \t\timage.onload = image.onerror = null\r\n\t// \t\tonFailure()\r\n\t// \t}\r\n\r\n\t// \timage.crossOrigin = 'anonymous'\r\n\r\n\t// \timage.src = file.href\r\n\t// }\r\n}\r\n\r\nexport default ImageParser","import Parser from './Parser.js'\r\n\r\nconst ghtml = (() => {\r\n\t/** @param { DocumentFragment | Element } documentFragment */\r\n\tfunction ghtml( documentFragment ) {\r\n\t\tif (!arguments.length) {\r\n\t\t\tthrow new TypeError('Failed to execute static \\'ghtml\\' on \\'WebKings\\': 1 argument required, but only 0 present.')\r\n\t\t}\r\n\t\telse if (!(documentFragment instanceof DocumentFragment || documentFragment instanceof Element)) {\r\n\t\t\tthrow new TypeError('Failed to execute static \\'ghtml\\' on \\'WebKings\\': parameter 1 is not of type DocumentFragment.')\r\n\t\t}\r\n\r\n\t\tfor (const element of Array.from(documentFragment.querySelectorAll('.__ghtml__'))) {\r\n\t\t\tconst parent = element.parentNode\r\n\t\t\tlet dataSetString = ''\r\n\t\t\tlet dataTransformString = ''\r\n\r\n\t\t\tif (parent) {\r\n\t\t\t\telement.classList.remove('__ghtml__')\r\n\r\n\t\t\t\tif (element.hasAttribute('data-set')) {\r\n\t\t\t\t\tdataSetString = element.getAttribute('data-set')\r\n\t\t\t\t\telement.removeAttribute('data-set')\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (element.hasAttribute('data-transform')) {\r\n\t\t\t\t\tdataTransformString = element.getAttribute('data-transform')\r\n\t\t\t\t\telement.removeAttribute('data-transform')\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (dataSetString) {\r\n\t\t\t\t\tconst iterators = parseIteratorString(dataSetString)\r\n\r\n\t\t\t\t\tif (iterators) {\r\n\t\t\t\t\t\tconst transformations = dataTransformString ? parseTransformString(dataTransformString) : null\r\n\t\t\t\t\t\tconst variables = {}\r\n\t\t\t\t\t\tlet isLoopDone = false\r\n\r\n\t\t\t\t\t\tdo {\r\n\t\t\t\t\t\t\tfor (const variable in iterators) {\r\n\t\t\t\t\t\t\t\tconst iterator = iterators[variable]\r\n\r\n\t\t\t\t\t\t\t\tif (iterator.type == 'array') {\r\n\t\t\t\t\t\t\t\t\tif (iterator.index < iterator.value.length) {\r\n\t\t\t\t\t\t\t\t\t\tvariables[variable] = iterator.value[iterator.index ++]\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\tisLoopDone = true\r\n\t\t\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse if (iterator.type == 'number') {\r\n\t\t\t\t\t\t\t\t\tif (iterator.step < 0 && iterator.end <= iterator.current || 0 < iterator.step && iterator.current <= iterator.end) {\r\n\t\t\t\t\t\t\t\t\t\tvariables[variable] = iterator.current\r\n\t\t\t\t\t\t\t\t\t\titerator.current += iterator.step\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\t\tisLoopDone = true\r\n\t\t\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (!isLoopDone) {\r\n\t\t\t\t\t\t\t\tconst clone = element.cloneNode(true)\r\n\r\n\t\t\t\t\t\t\t\tif (transformations) {\r\n\t\t\t\t\t\t\t\t\tfor (const {\r\n\t\t\t\t\t\t\t\t\t\tkey, values\r\n\t\t\t\t\t\t\t\t\t} of transformations) {\r\n\t\t\t\t\t\t\t\t\t\tlet transformationValue = ''\r\n\r\n\t\t\t\t\t\t\t\t\t\tfor (let k = 0; k < values.length; k ++) {\r\n\t\t\t\t\t\t\t\t\t\t\tconst value = values[k]\r\n\r\n\t\t\t\t\t\t\t\t\t\t\tif (value.type == 'text') {\r\n\t\t\t\t\t\t\t\t\t\t\t\ttransformationValue += value.value\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\telse if (value.type == 'var') {\r\n\t\t\t\t\t\t\t\t\t\t\t\tif (!(value.value in variables)) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\twarn('WebKings::ghtml: variable\\'s value is undefined.')\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\t\t\ttransformationValue += variables[value.value]\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (key == 'class') {\r\n\t\t\t\t\t\t\t\t\t\t\tclone.classList.add(transformationValue)\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\telse if (key == 'id') {\r\n\t\t\t\t\t\t\t\t\t\t\tclone.id = transformationValue\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\tparent.insertBefore(clone, element)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} while (!isLoopDone)\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tparent.removeChild(element)\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @param { string } string\r\n\t * @returns {{ [variable: string]: { type: \"array\", index: number, value: Array. } | { type: \"number\", start: number, end: number, step: number, current: number } }}\r\n\t */\r\n\tconst parseIteratorString = string => {\r\n\t\tconst iterator = {}\r\n\t\tconst params = string.split(';')\r\n\t\tlet isIteratorDefined = false\r\n\r\n\t\tfor (let i = 0; i < params.length; i ++) {\r\n\t\t\tconst param = params[i].split(':')\r\n\r\n\t\t\tif (param.length == 2) {\r\n\t\t\t\tlet key = param[0].trim()\r\n\t\t\t\tconst value = param[1].trim()\r\n\r\n\t\t\t\tif (/^\".+\"$/.test(key)) {\r\n\t\t\t\t\tkey = key.replace(/^\"|\"$/g, '')\r\n\t\t\t\t}\r\n\t\t\t\telse if (/\\s/.test(key)) {\r\n\t\t\t\t\tcontinue\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (/^\\[[^\\]]*\\]$/.test(value)) {\r\n\t\t\t\t\titerator[key] = {\r\n\t\t\t\t\t\ttype: 'array',\r\n\t\t\t\t\t\tindex: 0,\r\n\t\t\t\t\t\tvalue: parseArray(value)\r\n\t\t\t\t\t}\r\n\t\t\t\t\tisIteratorDefined = true\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tconst valueParams = value.split(',')\r\n\r\n\t\t\t\t\tfor (let j = 0; j < valueParams.length; j ++) {\r\n\t\t\t\t\t\tvalueParams[j] = parseFloat(valueParams[j].trim())\r\n\r\n\t\t\t\t\t\tif (!(-Infinity < valueParams[j] && valueParams[j] < Infinity)) {\r\n\t\t\t\t\t\t\tvalueParams.length = 0\r\n\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (valueParams.length) {\r\n\t\t\t\t\t\titerator[key] = {\r\n\t\t\t\t\t\t\ttype: 'number',\r\n\t\t\t\t\t\t\tstart: 0,\r\n\t\t\t\t\t\t\tend: 0,\r\n\t\t\t\t\t\t\tstep: 1\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tisIteratorDefined = true\r\n\r\n\t\t\t\t\t\tif (valueParams.length == 1) {\r\n\t\t\t\t\t\t\titerator[key].start = 1\r\n\t\t\t\t\t\t\titerator[key].end = valueParams[0]\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse if (valueParams.length == 2) {\r\n\t\t\t\t\t\t\titerator[key].start = valueParams[0]\r\n\t\t\t\t\t\t\titerator[key].end = valueParams[1]\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\titerator[key].start = valueParams[0]\r\n\t\t\t\t\t\t\titerator[key].end = valueParams[1]\r\n\t\t\t\t\t\t\titerator[key].step = valueParams[2]\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\titerator[key].current = iterator[key].start\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isIteratorDefined) {\r\n\t\t\treturn iterator\r\n\t\t}\r\n\r\n\t\treturn null\r\n\t}\r\n\r\n\t/**\r\n\t * @param { string } string\r\n\t * @returns { Array<{ key: \"class\" | \"id\", values: Array<{ type: \"text\" | \"var\", value: string }> }> }\r\n\t */\r\n\tconst parseTransformString = string => {\r\n\t\tconst transformations = []\r\n\t\tconst transform = string.split(';')\r\n\r\n\t\tfor (let i = 0; i < transform.length; i ++) {\r\n\t\t\tconst param = transform[i].split(':')\r\n\r\n\t\t\tif (param.length == 2) {\r\n\t\t\t\tlet key = param[0].trim()\r\n\t\t\t\tlet value = param[1].trim()\r\n\r\n\t\t\t\tif (/^\".+\"$/.test(key)) {\r\n\t\t\t\t\tkey = key.replace(/^\"|\"$/g, '')\r\n\t\t\t\t}\r\n\t\t\t\telse if (/\\s/.test(key)) {\r\n\t\t\t\t\tcontinue\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (key == 'class' || key == 'id') {\r\n\t\t\t\t\tconst transformation = {\r\n\t\t\t\t\t\tkey,\r\n\t\t\t\t\t\tvalues: []\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\twhile (value.length) {\r\n\t\t\t\t\t\tconst literalStartIndex = value.indexOf('{')\r\n\r\n\t\t\t\t\t\tif (literalStartIndex) {\r\n\t\t\t\t\t\t\tif (literalStartIndex == -1) {\r\n\t\t\t\t\t\t\t\ttransformation.values.push({\r\n\t\t\t\t\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\t\t\t\t\tvalue\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\tbreak\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\tconst literalEndIndex = value.indexOf('}', literalStartIndex)\r\n\r\n\t\t\t\t\t\t\t\tif (literalEndIndex != -1) {\r\n\t\t\t\t\t\t\t\t\ttransformation.values.push({\r\n\t\t\t\t\t\t\t\t\t\ttype: 'text',\r\n\t\t\t\t\t\t\t\t\t\tvalue: value.substring(0, literalStartIndex)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\ttransformation.values.push({\r\n\t\t\t\t\t\t\t\t\t\ttype: 'var',\r\n\t\t\t\t\t\t\t\t\t\tvalue: value.substring(literalStartIndex + 1, literalEndIndex)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\tvalue = value.substring(literalEndIndex + 1)\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\t\twarn('WebKings::ghtml: failed to parse \\'data-transform\\' attribute.')\r\n\t\t\t\t\t\t\t\t\treturn []\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tconst literalEndIndex = value.indexOf('}')\r\n\r\n\t\t\t\t\t\t\tif (literalEndIndex != -1) {\r\n\t\t\t\t\t\t\t\ttransformation.values.push({\r\n\t\t\t\t\t\t\t\t\ttype: 'var',\r\n\t\t\t\t\t\t\t\t\tvalue: value.substring(1, literalEndIndex)\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\tvalue = value.substring(literalEndIndex + 1)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\t\twarn('WebKings::ghtml: failed to parse \\'data-transform\\' attribute.')\r\n\t\t\t\t\t\t\t\treturn []\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\ttransformations.push(transformation)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn transformations\r\n\t}\r\n\r\n\t/** @param { string } string */\r\n\tconst parseArray = string => {\r\n\t\tconst array = string\r\n\t\t\t.replace(/^\\[|\\]$/g, '')\r\n\t\t\t.split(',')\r\n\t\tlet jsonString = '['\r\n\r\n\t\tfor (let i = 0; i < array.length; i ++) {\r\n\t\t\tconst value = array[i].trim()\r\n\r\n\t\t\tif (/^\".*\"$/.test(value)) {\r\n\t\t\t\tjsonString += value\r\n\t\t\t}\r\n\t\t\telse if (/^'.*'$/.test(value)) {\r\n\t\t\t\tjsonString += value.replace(/^'|'$/g, '\"')\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tjsonString += `\"${value}\"`\r\n\t\t\t}\r\n\r\n\t\t\tif (i < array.length - 1) {\r\n\t\t\t\tjsonString += ','\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tjsonString += ']'\r\n\r\n\t\ttry { return JSON.parse(jsonString) }\r\n\t\tcatch (exception) { error(exception) }\r\n\r\n\t\treturn []\r\n\t}\r\n\r\n\treturn ghtml\r\n})();\r\n\r\nclass HTMLParser extends Parser {\r\n\t__parse( content, resource ) {\r\n\t\tconst documentFragment = document.createDocumentFragment()\r\n\t\tconst divElement = document.createElement('div')\r\n\r\n\t\tlet startIndex = -1\r\n\t\tlet endIndex = -1\r\n\r\n\t\tdo {\r\n\t\t\tstartIndex = content.indexOf('', startIndex)\r\n\r\n\t\t\t\tif (endIndex != -1) {\r\n\t\t\t\t\tcontent = `${content.substring(0, startIndex)}${content.substring(endIndex + 3)}`\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcontent = content.substring(0, startIndex)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} while (startIndex != -1)\r\n\r\n\t\tdivElement.innerHTML = content\r\n\r\n\t\tconst arr = Array.from(divElement.childNodes)\r\n\r\n\t\tfor (const childNode of arr) {\r\n\t\t\tdocumentFragment.appendChild(childNode)\r\n\t\t}\r\n\r\n\t\tghtml(documentFragment)\r\n\r\n\t\tthis._applyHTMLTranslation(documentFragment)\r\n\r\n\t\tthis._applyLayout(resource, documentFragment)\r\n\r\n\t\treturn documentFragment\r\n\t}\r\n\r\n\t/** @param {{ data: DocumentFragment }} resource */\r\n\t_applyHTMLTranslation = documentFragment => {\r\n\t\tconst collection = documentFragment.querySelectorAll('.__vocabulary__')\r\n\t\tconst collectionLength = collection.length\r\n\r\n\t\tlet text,\r\n\t\t\ti,\r\n\t\t\tj\r\n\r\n\t\tfor (i = collectionLength - 1; i >= 0 ; i --) {\r\n\t\t\tif (collection[i].hasAttribute('data-vocabulary-key')) {\r\n\t\t\t\twhile (collection[i].childNodes.length) {\r\n\t\t\t\t\tcollection[i].removeChild(collection[i].childNodes[0])\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst name = collection[i]\r\n\t\t\t\t\t.getAttribute('data-vocabulary-key')\r\n\t\t\t\t\t.replace(/\\{app.socialName\\}/g, Social.name)\r\n\r\n\t\t\t\ttext = app.language.getText(name)\r\n\r\n\t\t\t\tif (typeof text === 'string') {\r\n\t\t\t\t\ttext = text.split('\\n')\r\n\r\n\t\t\t\t\tfor (j = 0; j < text.length; j ++) {\r\n\t\t\t\t\t\tcollection[i].appendChild(document.createTextNode(text[j]))\r\n\r\n\t\t\t\t\t\tif (j < text.length - 1) {\r\n\t\t\t\t\t\t\tcollection[i].appendChild(app.createElement({ tag: 'br' }))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tcollection[i].textContent = text\r\n\t\t\t\t}\r\n\r\n\t\t\t\tcollection[i].removeAttribute('data-vocabulary-key')\r\n\t\t\t}\r\n\r\n\t\t\tcollection[i].classList.remove('__vocabulary__')\r\n\t\t}\r\n\t}\r\n\r\n\t/** @param {{ data: DocumentFragment, target: string, name: string }} resource */\r\n\t_applyLayout = (resource, documentFragment) => {\r\n\t\ttry {\r\n\t\t\tconst targetName = resource.options?.target\r\n\r\n\t\t\tif (targetName) {\r\n\t\t\t\tconst target = document.querySelector(targetName)\r\n\r\n\t\t\t\tif (target) {\r\n\t\t\t\t\ttarget.appendChild(documentFragment.cloneNode(true))\r\n\r\n\t\t\t\t\tresource.reduce()\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\t// TODO: удалить после обновления cordova и ios odr\r\n\t\t\t\t\tif (targetName === '#loadingScreen') {\r\n\t\t\t\t\t\tconst target = document.querySelector('#loadingSecondStepBox')\r\n\r\n\t\t\t\t\t\ttarget.appendChild(documentFragment.cloneNode(true))\r\n\r\n\t\t\t\t\t\tresource.reduce()\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\twarn('Could not find target element: `' + targetName + '`.')\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (exception) { error(exception) }\r\n\t}\r\n}\r\n\r\nexport default HTMLParser","import Parser from './Parser.js'\r\n\r\nclass AudioParser extends Parser {\r\n\tasync load( resource ) {\r\n\t\ttry {\r\n\t\t\tawait super.load(resource)\r\n\r\n\t\t\tSound.append(resource)\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tconsole.error(e)\r\n\t\t}\r\n\t}\r\n}\r\n\r\nexport default AudioParser","import ResourcesCollection from './ResourcesCollection.js'\r\nimport Resource from './Resource.js'\r\nimport Request from './Request.js'\r\nimport { parseURL } from './utils.js'\r\nimport LoadController from './LoadController.js'\r\n\r\nimport ManifestParser from './parsers/ManifestParser.js'\r\nimport JSONParser from './parsers/JSONParser.js'\r\nimport CSSParser from './parsers/CSSParser.js'\r\nimport ImageParser from './parsers/ImageParser.js'\r\nimport HTMLParser from './parsers/HTMLParser.js'\r\nimport AudioParser from './parsers/AudioParser.js'\r\nimport JSParser from './parsers/JSParser.js'\r\n\r\nclass Loader {\r\n\t#resources = new ResourcesCollection()\r\n\r\n\t#resourcesEndpoint\r\n\r\n\t/** @type { String } */\r\n\t#baseURL\r\n\r\n\t/** @type { LoadController } */\r\n\t#loadController = new LoadController()\r\n\r\n\t/** @type {{ [literal: string]: string }} */\r\n\t#literals = {}\r\n\r\n\t/** @type { String } */\r\n\t#clientVersion\r\n\r\n\t/** @type { Boolean } */\r\n\t#isAppDev\r\n\r\n\tasync initialize( isDev, isWebpSupported, clientVersion ) {\r\n\t\tif (Loader.instance) {\r\n\t\t\treturn Loader.instance\r\n\t\t}\r\n\r\n\t\tLoader.instance = this\r\n\t\tLoader.isWebpSupported = isWebpSupported\r\n\r\n\t\tthis.#isAppDev = isDev\r\n\t\tthis.#clientVersion = clientVersion\r\n\r\n\t\tthis._setBaseURL()\r\n\r\n\t\tif (IS_VILLALIKE) {\r\n\t\t\tconst { default: pixiLoader } = await import('js/modules/pixiManager/PixiLoader.js')\r\n\r\n\t\t\tLoader.pixiLoader = pixiLoader\r\n\t\t}\r\n\t}\r\n\r\n\t/** @returns { Promise } */\r\n\tasync load( data, onProgress, isPrioritized = false ) {\r\n\t\tlet collection\r\n\r\n\t\tif (data instanceof ResourcesCollection) {\r\n\t\t\tcollection = data\r\n\t\t}\r\n\t\telse {\r\n\t\t\tcollection = this.#resources.findByTag(data)\r\n\t\t}\r\n\r\n\t\tif (!collection.isLoaded) {\r\n\t\t\tconst loadPromise = new Promise(resolve => {\r\n\t\t\t\tcollection.once('loaded', resolve)\r\n\t\t\t})\r\n\r\n\t\t\tthis.#loadController.push(collection, isPrioritized, onProgress)\r\n\r\n\t\t\treturn loadPromise\r\n\t\t}\r\n\r\n\t\treturn collection\r\n\t}\r\n\r\n\t/** @returns { ResourcesCollection } */\r\n\tfindByTag(...args) {\r\n\t\treturn this.#resources.findByTag(...args)\r\n\t}\r\n\r\n\t/** @returns { ResourcesCollection } */\r\n\tfindByName(...args) {\r\n\t\treturn this.#resources.findByName(...args)\r\n\t}\r\n\r\n\t/** @returns { Resource | null } */\r\n\tget(...args) {\r\n\t\treturn this.#resources.get(...args)\r\n\t}\r\n\r\n\t/** @returns { Resource | undefined } */\r\n\taddResource(...args) {\r\n\t\treturn this.#resources.addResource(...args)\r\n\t}\r\n\r\n\t/** @returns { Resource | undefined } */\r\n\tcreateResource(data) {\r\n\t\tlet path = data.path\r\n\r\n\t\tif (Loader.isWebpSupported && typeof path === 'string' && /\\.(png|jpg)$/.test(path)) {\r\n\t\t\tpath = path.replace(/\\.(png|jpg)$/, '.webp')\r\n\t\t}\r\n\r\n\t\treturn this.addResource(path, data)\r\n\t}\r\n\r\n\treduce( data ) {\r\n\t\tif (data instanceof ResourcesCollection) {\r\n\t\t\tconst resources = data.resources\r\n\t\t\tlet resourceID\r\n\r\n\t\t\tfor (resourceID in resources) {\r\n\t\t\t\tthis.#resources.removeResource(resourceID)\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tthis.#resources.removeResource(data.id)\r\n\t\t}\r\n\t}\r\n\r\n\t_setBaseURL() {\r\n\t\tthis.#baseURL = '/'\r\n\r\n\t\tconst baseTag = document.querySelector('base')\r\n\r\n\t\tif (baseTag) {\r\n\t\t\tthis.#baseURL = baseTag.getAttribute('href')\r\n\t\t}\r\n\r\n\t\tif (IS_DEV) {\r\n\t\t\tlet branchName = ''\r\n\r\n\t\t\tif (Social.isGP) {\r\n\t\t\t\tbranchName = 'main'\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst data = JSON.parse(globalThis.localStorage.getItem('branch'))\r\n\r\n\t\t\t\t\tbranchName = data?.value || 'main'\r\n\t\t\t\t}\r\n\t\t\t\tcatch {}\r\n\t\t\t}\r\n\r\n\t\t\tif (branchName) {\r\n\t\t\t\tthis.#baseURL = `/views/${branchName}/`\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (TEST_RELEASE) {\r\n\t\t\tlet branchName = ''\r\n\r\n\t\t\tif (Social.isGP) {\r\n\t\t\t\tbranchName = 'main'\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst data = JSON.parse(globalThis.localStorage.getItem('branch'))\r\n\r\n\t\t\t\t\tbranchName = data?.value || 'main'\r\n\t\t\t\t}\r\n\t\t\t\tcatch {}\r\n\t\t\t}\r\n\r\n\t\t\tif (branchName) {\r\n\t\t\t\tthis.#baseURL = `/views/${branchName}/`\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tasync loadManifest( name, needUzip = false ) {\r\n\t\ttry {\r\n\t\t\tconst manifestVersion = this.#isAppDev ? 'dev' : this.#clientVersion\r\n\t\t\tconst id = `${ '/json/manifests/' }${ manifestVersion }/${ name }.json`\r\n\r\n\t\t\tconst res = this.#resources.addResource(id, {\r\n\t\t\t\ttype: 'manifest',\r\n\t\t\t\tversion: this.#isAppDev ? Date.now() : ''\r\n\t\t\t})\r\n\r\n\t\t\tif (res) {\r\n\t\t\t\tconst collection = await res.load()\r\n\t\t\t\tconst resources = collection.resources\r\n\t\r\n\t\t\t\tlet resourceID\r\n\t\r\n\t\t\t\tfor (resourceID in resources) {\r\n\t\t\t\t\tconst resource = resources[resourceID]\r\n\t\r\n\t\t\t\t\tthis.#resources.pushResource(resource)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tcatch (e) {\r\n\t\t\tconsole.error(e)\r\n\t\t}\r\n\r\n\t\tthis._filesReduceByLang()\r\n\t\tthis._filesReduceByCacheBattleImages()\r\n\t}\r\n\r\n\t/**\r\n\t * Метод выполняет загрузку APK-манифеста для проверки наличия ресурсов\r\n\t * @returns {Promise}\r\n\t */\r\n\tasync checkAPKResources() {\r\n\t\tconsole.log('Loading apk manifest')\r\n\r\n\t\tconst base = globalThis.parent.APK_FILES_ROOT || '.'\r\n\r\n\t\ttry {\r\n\t\t\tconst apkManifest = await Loader.parsers.json.parse({\r\n\t\t\t\thref: `${ base }/resources.json`\r\n\t\t\t})\r\n\r\n\t\t\tthis.apkManifest = apkManifest\r\n\t\t}\r\n\t\tcatch {\r\n\t\t\tconsole.error('Failed to load apk manifest')\r\n\t\t}\r\n\t}\r\n\r\n\t_filesReduceByCacheBattleImages() {\r\n\t\tconst cacheBattleImages = this.findByTag('cacheBattleImages')\r\n\t\tconst resourcesToReduce = []\r\n\r\n\t\tif (cacheBattleImages.length) {\r\n\t\t\tcacheBattleImages.forEach(resource => {\r\n\t\t\t\tif (!resource.isOnTheDevice) {\r\n\t\t\t\t\tresourcesToReduce.push(resource.name)\r\n\t\t\t\t}\r\n\t\t\t})\r\n\r\n\t\t\tif (resourcesToReduce.length) {\r\n\t\t\t\tthis.findByName(resourcesToReduce)\r\n\t\t\t\t\t.reduce()\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * @param {string} key\r\n\t * @param {string} value\r\n\t */\r\n\tsetLiteral( key, value, data ) {\r\n\t\tif (arguments.length < 1) {\r\n\t\t\tthrow new TypeError(`Failed to execute 'setLiteral' on 'Loader': 2 arguments required, but only ${arguments.length} present.`)\r\n\t\t}\r\n\t\telse if (typeof key != 'string' && !(key instanceof String)) {\r\n\t\t\tthrow new TypeError('Failed to execute \\'require\\' on \\'Loader\\': parameter 1 is not of type String.')\r\n\t\t}\r\n\t\telse if (typeof value != 'string' && !(value instanceof String)) {\r\n\t\t\tthrow new TypeError('Failed to execute \\'require\\' on \\'Loader\\': parameter 2 is not of type String.')\r\n\t\t}\r\n\r\n\t\tObject.defineProperty(this.#literals, key, {\r\n\t\t\tvalue: value,\r\n\t\t\tenumerable: true\r\n\t\t})\r\n\r\n\t\tthis._filesReduceByLang()\r\n\t}\r\n\r\n\t_filesReduceByLang() {\r\n\t\tconst literals = this.#literals\r\n\r\n\t\tif (literals && literals.lang) {\r\n\t\t\tconst isRus = literals.lang === 'ru'\r\n\t\t\tconst isEn = literals.lang === 'en'\r\n\r\n\t\t\tconst compareLangResources = (lang, lang2) => {\r\n\t\t\t\tconst resources = this.findByTag(lang).resources\r\n\r\n\t\t\t\tconst resources2 = _\r\n\t\t\t\t\t.chain(this.findByTag(lang2).resources)\r\n\t\t\t\t\t.map('name')\r\n\t\t\t\t\t.map(item => item.replace(/_\\w+\\./, '.'))\r\n\t\t\t\t\t.value()\r\n\r\n\t\t\t\tconst outPutResources = _.filter(resources, res => !_.includes(resources2, res.name.replace(/_\\w+\\./, '.')))\r\n\r\n\t\t\t\tfor (const resource of outPutResources) {\r\n\t\t\t\t\tresource.tags = _.filter(resource.tags, tag => tag !== lang)\r\n\t\t\t\t\tresource.tags.push(lang2)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t!isEn && compareLangResources('en', literals.lang)\r\n\t\t\t!isRus && compareLangResources('ru', literals.lang)\r\n\r\n\t\t\tthis\r\n\t\t\t\t.findByTag(`_lang_ & !${literals.lang}`)\r\n\t\t\t\t.reduce()\r\n\t\t}\r\n\t}\r\n\r\n\tresume() {\r\n\t\tthis.#loadController.backgroundLoad.resume(this.#loadController)\r\n\t}\r\n\r\n\tpause() {\r\n\t\tthis.#loadController.backgroundLoad.pause(this.#loadController)\r\n\t}\r\n\r\n\t/** @returns { Promise } */\r\n\tstatic fetchResource( resource ) {\r\n\t\treturn Loader.fetch(resource.href, {\r\n\t\t\tneedRetry: Boolean(resource.isCritical),\r\n\t\t\tresource\r\n\t\t})\r\n\t}\r\n\r\n\t/**\r\n\t * @returns { Promise }\r\n\t * @param { string } fullHref Полный путь до ресурса\r\n\t * @param { any } data Нужна ли повторная отправка\r\n\t *\r\n\t * По умолчанию fetch выполнится всего 1 раз!\r\n\t * */\r\n\tstatic fetch( fullHref, data = {} ) {\r\n\t\tconst request = new Request()\r\n\r\n\t\tconst fetchData = Object.assign({\r\n\t\t\tneedRetry: false\r\n\t\t}, data)\r\n\r\n\t\treturn request.execute(fullHref, fetchData)\r\n\t}\r\n\r\n\t/** @param { Resource } resource */\r\n\tstatic getResourceHref( resource ) {\r\n\t\tconst { protocol, hostname, port, dir } = Loader.resourcesEndpoint\r\n\t\tconst version = resource.version ? `?v=${ resource.version }` : ''\r\n\t\tlet resourceName,\r\n\t\t\tresultAbsolutePath\r\n\r\n\t\tif (resource.hash) {\r\n\t\t\tconst extLength = resource.extension.length\r\n\t\t\tconst nameWithoutExt = resource.id.substring(-extLength, resource.id.length - extLength)\r\n\r\n\t\t\tresourceName = `${ nameWithoutExt }${ resource.hash }.${ resource.extension }`\r\n\t\t}\r\n\t\telse {\r\n\t\t\tresourceName = resource.id\r\n\t\t}\r\n\r\n\t\tconst resourcePath = `${ dir }${ resourceName }${ version }`.replace('//', '/')\r\n\r\n\t\tif (protocol === 'http:' || protocol === 'http' || protocol === 'https:') {\r\n\t\t\tif (resource.isOnTheDevice) {\r\n\t\t\t\tconst base = globalThis.parent.APK_FILES_ROOT || '.'\r\n\r\n\t\t\t\tresultAbsolutePath = `${ base }${ resourcePath }`\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\tresultAbsolutePath = `${ protocol }//${ hostname }${ port ? ':' + port : ''}${ resourcePath }`\r\n\t\t\t}\r\n\t\t}\r\n\t\telse {\r\n\t\t\tresultAbsolutePath = `${ protocol }${ resourcePath }`\r\n\t\t}\r\n\r\n\t\treturn resultAbsolutePath\r\n\t}\r\n\r\n\tset resourcesEndpoint( value ) {\r\n\t\tconst url = parseURL(value)\r\n\r\n\t\tthis.#resourcesEndpoint = {\r\n\t\t\tprotocol: url.protocol,\r\n\t\t\thostname: url.hostname,\r\n\t\t\tport: url.port,\r\n\t\t\tdir: this.#baseURL,\r\n\t\t\tbase: url.base\r\n\t\t}\r\n\r\n\t\tLoader.resourcesEndpoint = this.#resourcesEndpoint\r\n\t}\r\n\r\n\tget resourcesEndpoint() {\r\n\t\tconst { protocol, hostname, port, dir, base } = this.#resourcesEndpoint\r\n\r\n\t\treturn `${protocol}//${hostname}${port ? `:${port}` : ''}${dir}${base}`\r\n\t}\r\n\r\n\tget literals() {\r\n\t\treturn this.#literals\r\n\t}\r\n\r\n\tget currentBranch() {\r\n\t\treturn this.#baseURL.replace(/(\\/views\\/|\\/)/g, '')\r\n\t}\r\n\r\n\tstatic parsers = {\r\n\t\tmanifest: new ManifestParser(),\r\n\t\tjson: new JSONParser(),\r\n\t\tcss: new CSSParser(),\r\n\t\timage: new ImageParser(),\r\n\t\thtml: new HTMLParser(),\r\n\t\taudio: new AudioParser(),\r\n\t\tjs: new JSParser()\r\n\t}\r\n\r\n\t/** @type { Loader } */\r\n\tstatic instance\r\n\r\n\t/** @type { Boolean } Поддерживается ли webp */\r\n\tstatic isWebpSupported\r\n\r\n\t/** @type { import('js/modules/pixiManager/PixiLoader.js').default } */\r\n\tstatic pixiLoader\r\n}\r\n\r\nexport default Loader","import Parser from './Parser.js'\r\n\r\nclass JSParser extends Parser {\r\n\tload( resource ) {\r\n\t\tif (resource.tags?.includes('sdk')) {\r\n\t\t\treturn this._loadViaElement(resource)\r\n\t\t}\r\n\r\n\t\treturn super.load(resource)\r\n\t}\r\n\r\n\t__parse( content ) {\r\n\t\ttry {\r\n\t\t\teval(content)\r\n\t\t}\r\n\t\tcatch (exception) {\r\n\t\t\tconsole.error(exception)\r\n\t\t}\r\n\t}\r\n\r\n\t_loadViaElement( resource ) {\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\tconst scriptElement = document.createElement('script')\r\n\r\n\t\t\tscriptElement.onload = () => {\r\n\t\t\t\tscriptElement.onload = scriptElement.onerror = scriptElement.onabort = scriptElement.oncancel = null\r\n\r\n\t\t\t\tresolve(scriptElement)\r\n\t\t\t}\r\n\r\n\t\t\tscriptElement.onerror = () => {\r\n\t\t\t\tdocument.head.removeChild(scriptElement)\r\n\t\t\t\tscriptElement.onload = scriptElement.onerror = scriptElement.onabort = scriptElement.oncancel = null\r\n\r\n\t\t\t\tif (resource.isErrorsIgnore) {\r\n\t\t\t\t\treject()\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tthis._loadViaElement(resource)\r\n\t\t\t\t\t\t\t.then(resolve)\r\n\t\t\t\t\t\t\t.catch(reject)\r\n\t\t\t\t\t}, 500)\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tscriptElement.onabort = scriptElement.oncancel = scriptElement.onerror\r\n\t\t\tscriptElement.type = 'application/javascript'\r\n\t\t\tscriptElement.src = resource.href\r\n\t\t\tscriptElement.async = true\r\n\r\n\t\t\tdocument.head.appendChild(scriptElement)\r\n\t\t})\r\n\t}\r\n}\r\n\r\nexport default JSParser","import Loader from '../Loader.js'\r\n\r\nclass Parser {\r\n\tasync parse( resource ) {\r\n\t\tconst response = await this.load(resource)\r\n\r\n\t\treturn this.__parse(response, resource)\r\n\t}\r\n\r\n\tload( resource ) {\r\n\t\treturn Loader.fetchResource(resource)\r\n\t}\r\n\r\n\t__parse( content, resource ) {\r\n\t\treturn content\r\n\t}\r\n}\r\n\r\nexport default Parser"],"names":["Resource","EventTarget","tags","isLoaded","isLoading","isCritical","isReduced","constructor","id","data","super","this","_initProps","_defineType","match","href","version","options","isErrorsIgnore","isOnTheDevice","hash","extension","hasOwnProperty","music","Boolean","volume","voice","isPixi","type","load","parser","Loader","parsers","Promise","resolve","onDone","emit","parse","then","catch","console","error","concat","reduce","instance","dispose","name","getResourceHref","isStyle","isImage","isAudio","evaluate","string","operation","operand","i","operandsPriority","length","indexOf","isOperandSimple","index","operator","operand1","operand2","substring","getLowestPriorityOperation","TypeError","ResourcesCollection","onProgress","isPrioritized","_processOnProgress","findByTag","tag","resourceID","resource","collection","tagString","resources","join","replace","pushResource","findByName","checkResourceRegExp","findName","test","tryFind","query","isWebpSupported","checkResourceString","RegExp","Array","isArray","item","list","_loadResources","addResource","_addUnloadedResource","removeResource","get","file","areLiteralsResolved","literals","expression","$1","lang","warn","otherCollection","resultCollection","pushResources","unloadedResources","push","once","resIndex","splice","unloadedCounter","progress","loadedCounter","Number","toFixed","insertStylesTo","element","_el","insertToElement","forEach","_insertStylesToElement","cssStyle","_","styles","styleTag","appendChild","isFullReady","on","callback","at","targetKey","Object","keys","_data","values","resourcesCounter","isEmpty","Request","execute","Social","isGP","_xhr","_fetch","needRetry","reject","request","XMLHttpRequest","responseType","open","onload","onerror","onabort","onprogress","status","response","setTimeout","statusText","send","exception","message","fetch","text","e","maxLoadTasks","unshift","loadCtrl","canLoad","shift","finally","pause","resume","loadingCounter","_initLoads","window","navigator","hardwareConcurrency","LoadQueue","Math","ceil","backgroundLoad","priorityLoad","RESOURCE_FIELDS","ManifestParser","Parser","includes","loadResolver","log","loadPromise","tryFetch","async","fetchResource","JSON","__parse","manifest","resourceData","isDev","_formResource","Date","now","webpPath","imageResource","webp","apkManifest","apkResourceHash","resourceHash","filePath","replaceConfig","_decodeFilePath","paths","contents","key","t","_decodeTags","o","h","w","newTags","oldFilePath","parts","split","encodedPart","Error","fileName","JSONParser","content","json","app","language","appendVocabulary","HASHED_CSS","reservedNames","CSSStyle","cssText","_isCommited","_fragments","_name","_resourceDependantFragments","_resourcesDependantFragments","_fragmentsTexts","_styleTag","document","createElement","commit","_this","mainFragmentText","fragmentsLength","fragment","properties","fragmentText","_loop","property","j","propertyName","propertyValue","getUnresolvedResources","_loop2","k","resourcesDependantFragment","commitFragment","resolveResourcesNames","keyframes","progressKey","self","location","origin","textContent","setAttribute","resourceName","fragments","fragmentsText","_ref","_ref2","isNativeStyleSheetSupported","_styleSheet","style","_parse","value","char","prevChar","nextChar","depth","isReadingKey","isReadingComment","isEscapedSequence","escapeChar","cssTextLength","trim","_parseKeyframes","_parseProperties","translate","getText","vocabularyRegEx","$2","unresolvedResources","$0","propertyText","comment","_getPropertyValue","a","path","c","d","keyframesText","static","getResourcesNames","names","StyleSheetList","styleSheets","CSSStyleSheet","prototype","insertRule","bind","fragmentsStyleTag","_allFragmentsAsText","allFragmentsAsText","stylesMap","cloneNode","CSSParser","ImageParser","_load","image","Image","target","src","parseIteratorString","parseTransformString","parseArray","ghtml","iterator","params","isIteratorDefined","param","valueParams","parseFloat","Infinity","start","end","step","current","transformations","transform","transformation","literalStartIndex","literalEndIndex","array","jsonString","documentFragment","arguments","DocumentFragment","Element","from","querySelectorAll","parent","parentNode","dataSetString","dataTransformString","classList","remove","hasAttribute","getAttribute","removeAttribute","iterators","variables","isLoopDone","variable","clone","transformationValue","add","insertBefore","removeChild","HTMLParser","createDocumentFragment","divElement","startIndex","endIndex","innerHTML","arr","childNodes","childNode","_applyHTMLTranslation","_applyLayout","createTextNode","targetName","querySelector","AudioParser","Sound","append","LoadController","initialize","clientVersion","_setBaseURL","args","createResource","baseTag","loadManifest","needUzip","manifestVersion","res","_filesReduceByLang","_filesReduceByCacheBattleImages","checkAPKResources","base","globalThis","APK_FILES_ROOT","cacheBattleImages","resourcesToReduce","setLiteral","String","defineProperty","enumerable","isRus","compareLangResources","lang2","resources2","chain","map","outPutResources","filter","fullHref","fetchData","assign","resultAbsolutePath","_Loader$resourcesEndp","resourcesEndpoint","protocol","hostname","port","dir","extLength","nameWithoutExt","resourcePath","url","struct","pathname","search","URL","hostnameMatch","protocolMatch","pathnameMatch","lastIndexOf","pop","searchMatch","parseURL","_this$resourcesEndpoi","currentBranch","css","html","audio","js","JSParser","_loadViaElement","eval","scriptElement","oncancel","head"],"mappings":"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K,SACL,EAAK,oBACL,EAAK,SACL,EAAK,kBACL,EAAK,sBACL,EAAK,iBACL,EAAK,mBACL,EAAK,OACL,EAAK,MACL,EAAK,mBACL,EAAK,YACL,EAAK,UACL,EAAK,WACL,EAAK,gBACL,EAAK,mBACL,EAAK,QACL,EAAK,SACL,EAAK,aACL,EAAK,UACL,EAAK,kBACL,EAAK,wBACL,EAAK,wBACL,EAAK,cACL,EAAK,aACL,EAAK,aACL,EAAK,aACL,EAAK,UACL,EAAK,eACL,EAAK,aACL,EAAK,aACL,EAAK,kBACL,EAAK,YACL,EAAK,iBACL,EAAK,gBACL,EAAK,UACL,EAAK,SACL,EAAK,gBACL,EAAK,cACL,EAAK,QACL,EAAK,YACL,EAAK,eACL,EAAK,cACL,EAAK,aACL,EAAK,qBACL,EAAK,sBACL,EAAK,iBACL,EAAK,cACL,GAAM,cACN,GAAM,gBACN,GAAM,cACN,GAAM,iBACN,GAAM,cACN,GAAM,eACN,GAAM,eACN,GAAM,eACN,GAAM,iBACN,GAAM,SACN,GAAM,gBACN,GAAM,iBACN,GAAM,sBACN,GAAM,cACN,GAAM,QACN,GAAM,gBACN,GAAM,oBACN,GAAM,kBACN,GAAM,cACN,GAAM,8BACN,GAAM,sBACN,GAAM,qBACN,GAAM,aACN,GAAM,oBACN,GAAM,YACN,GAAM,wBACN,GAAM,gBACN,GAAM,sBACN,GAAM,cACN,GAAM,OACN,GAAM,UACN,GAAM,cACN,GAAM,eACN,GAAM,sBACN,GAAM,mBACN,GAAM,kBACN,GAAM,8BACN,GAAM,2BACN,GAAM,YACN,GAAM,aACN,GAAM,aACN,GAAM,wBACN,GAAM,aACN,GAAM,sBACN,GAAM,mBACN,GAAM,kBACN,GAAM,YACN,GAAM,mBACN,GAAM,kBACN,GAAM,cACN,GAAM,yBACN,GAAM,4BACN,GAAM,aACN,GAAM,iBACN,GAAM,iBACN,GAAM,QACN,GAAM,mBACN,GAAM,oBACN,GAAM,wBACN,GAAM,qBACN,GAAM,sBACN,GAAM,uBACN,GAAM,2BACN,GAAM,wBACN,GAAM,eACN,GAAM,gBACN,GAAM,oBACN,GAAM,iBACN,GAAM,aACN,GAAM,uBACN,GAAM,cACN,GAAM,aACN,GAAM,4BACN,GAAM,0BACN,GAAM,6BACN,GAAM,eACN,GAAM,cACN,GAAM,YACN,GAAM,kBACN,GAAM,OACN,GAAM,4BACN,GAAM,aACN,GAAM,sBACN,GAAM,6BACN,GAAM,mCACN,GAAM,2BACN,GAAM,SACN,GAAM,aACN,GAAM,sBACN,GAAM,QACN,GAAM,cACN,GAAM,eACN,GAAM,Q,sGC7IP,IAAMC,EACI,UADJA,EAEM,YAFNA,EAIK,OAMX,MAAMC,UAAiB1O,EAAAA,EAgBtB,IAAY,EAEZ,GAEAM,WAAAA,CAAaqO,EAAS9L,GACrBpC,QAEAC,KAAKkO,aAAc,EAGnBlO,KAAKmO,WAAa,GAClBnO,KAAKoO,MAAQjM,EAGbnC,KAAKqO,4BAA8B,CAAC,EAGpCrO,KAAKsO,6BAA+B,CAAC,EAErCtO,KAAKuO,gBAELvO,MAAK,EAAWiO,EAEhBjO,KAAKwO,UAAYC,SAASC,cAAc,QACzC,CAEAC,MAAAA,GAAU,IAADC,EAAA,KACR,IAAI5O,KAAKkO,YAAT,CAIA,IACCtL,EADGiM,EAAmB,GAGjBC,EAAkB9O,KAAKmO,WAAWrL,OAExC,IAAKF,EAAI,EAAGA,EAAIkM,EAAiBlM,IAAM,CACtC,IAAMmM,EAAW/O,KAAKmO,WAAWvL,GAC3B+J,EAAMoC,EAAS,GAErB,GAAIA,EAAS,KAAOhB,EAAuB,CAI1C,IAHA,IAAMiB,EAAaD,EAAS,GACxBE,EAAe,GAAEC,EAAA,WAGpB,IAAMC,EAAWH,EAAWI,GAE5B,GAAID,EAAS,GACZF,GAAgBE,EAAS,OAErB,CACJ,IAAME,EAAeF,EAAS,GAC1BG,EAAgBH,EAAS,GAG7B,IAFgE,GAAlDG,EAAcvM,QAAQgL,GAEzB,CACV,IAAM7J,EAAY0K,EAAKW,uBAAuBD,GAM9C,GAJIlO,EAAOwD,kBACV0K,EAAgBA,EAAclL,QAAQ,iBAAkB,WAGrDF,EAAUpB,OACb,IADsB,IAAD0M,EAAA,SAAAC,GAEpBb,EAAKN,6BAA6BpK,EAAUuL,GAAGtN,MAAQyM,EAAKN,6BAA6BpK,EAAUuL,GAAGtN,OAAS,GAG/G,IAAMuN,EAA6B,CAClCzO,KAAM8M,EACNpB,MACAqC,WAAY,CAAE,CAAEK,EAAcC,KAG/BV,EAAKN,6BAA6BpK,EAAUuL,GAAGtN,MAAMgE,KAAKuJ,GAE1DxL,EAAUuL,GAAGrJ,KAAK,UAAU,IAAMwI,EAAKe,eAAezL,EAAUuL,GAAGtN,OACpE,EAbSsN,EAAI,EAAGA,EAAIvL,EAAUpB,OAAQ2M,IAAID,EAAAC,QAgB1CR,GAAY,GAAAlN,OAAOsN,EAAY,KAAAtN,OAAI6M,EAAKgB,sBAAsBN,GAAc,IAE9E,MAECL,GAAY,GAAAlN,OAAOsN,EAAY,KAAAtN,OAAIuN,EAAa,IAElD,CACD,EA1CSF,EAAI,EAAGA,EAAIJ,EAAWlM,OAAQsM,IAAIF,IA4CvCD,IACHJ,GAAgB,GAAA9M,OAAO4K,EAAG,KAAA5K,OAAIkN,EAAY,KAE5C,MACK,GAAIF,EAAS,KAAOhB,EAAyB,CAIjD,IAHA,IAAM8B,EAAYd,EAAS,GACvBE,EAAe,GAEVG,EAAI,EAAGA,EAAIS,EAAU/M,OAAQsM,IAAM,CAC3C,IAAMU,EAAcD,EAAUT,GAAG,GAC3BJ,EAAaa,EAAUT,GAAG,GAEhCH,GAAY,GAAAlN,OAAO+N,EAAW,KAE9B,IAAK,IAAIL,EAAI,EAAGA,EAAIT,EAAWlM,OAAQ2M,IAAM,CAC5C,IAAMN,EAAWH,EAAWS,GAExBN,EAAS,GACZF,GAAgBE,EAAS,GAGzBF,GAAY,GAAAlN,OAAOoN,EAAS,GAAE,KAAApN,OAAIoN,EAAS,GAAE,IAE/C,CAEAF,GAAgB,GACjB,CAEIA,IACHJ,GAAgB,GAAA9M,OAAO4K,EAAG,KAAA5K,OAAIkN,EAAY,KAE5C,CACD,CAEIJ,IACHA,GAAgB,mBAAA9M,OAAuBgO,KAAKC,SAASC,QAAMlO,OAAG/B,KAAKoO,MAAK,OAExEpO,KAAKwO,UAAU0B,YAAcrB,EAC7B7O,KAAKwO,UAAU2B,aAAa,WAAYnQ,KAAKoO,QAG9CpO,KAAKmO,WAAa,KAClBnO,KAAKkO,aAAc,CArGnB,CAsGD,CAGAyB,cAAAA,CAAgBS,GACf,GAAIA,KAAgBpQ,KAAKsO,6BAA8B,CACtD,IAAM+B,EAAYrQ,KAAKsO,6BAA6B8B,GAChDE,EAAgB,GAEpB,IAAK,IAAMvB,KAAYsB,EAAW,CACjC,IAAIpB,EAAe,GAEnB,GAAIF,EAAS9N,OAAS8M,EACrB,QAAAwC,KAA8CxB,EAASC,WAAY,CAAC,IAADwB,G,EAAA,E,4CAAAD,I,s1BAAtDlB,EAAYmB,EAAA,GAAElB,EAAakB,EAAA,GACXxQ,KAAKuP,uBAAuBD,GAE/BxM,SACxBmM,GAAY,GAAAlN,OAAOsN,EAAY,KAAAtN,OAAI/B,KAAK4P,sBAAsBN,GAAc,KAE9E,CAGGL,IACHqB,GAAa,GAAAvO,OAAOgN,EAASpC,IAAG,KAAA5K,OAAIkN,EAAY,KAElD,CAEA,GAAIqB,KACEtC,EAASyC,8BAAgCzQ,KAAK0Q,aAAa,CAC1D1Q,KAAKuO,kBACTvO,KAAKuO,gBAAkB,IAGxB,IAAMoC,EAAQlC,SAASC,cAAc,SACrCiC,EAAMT,YAAcI,EAEpBtQ,KAAKyB,KAAK,oBAAqBkP,GAE/B3Q,KAAKuO,gBAAgBpI,KAAKmK,EAC3B,CAGDtQ,KAAKsO,6BAA6B8B,GAActN,OAAS,SAClD9C,KAAKsO,6BAA6B8B,EAC1C,C,OACD,CAGAQ,MAAAA,CAAQ3C,GAcP,IAbA,IAAItB,EAAM,GACNkE,EAAQ,GACRC,EAAO,GACPC,EAAW,GACXC,EAAW,GACXC,EAAQ,EACRC,GAAe,EACfC,GAAmB,EACnBC,GAAoB,EACpBC,EAAa,GAEXC,EAAgBrD,EAAQnL,OAErBF,EAAI,EAAGA,EAAI0O,EAAe1O,IAAM,CAKxC,GAJAkO,EAAO7C,EAAQrL,GACfmO,EAAW9C,EAAQrL,EAAI,GACvBoO,EAAW/C,EAAQrL,EAAI,IAElBwO,EACJ,GAAa,MAATN,GAA6B,MAAbE,EACnBG,GAAmB,OAEf,GAAiB,MAAbJ,GAA6B,MAATD,IAC5BK,GAAmB,EACfD,GACH,SAKH,IAAIC,IAAoBD,EAAxB,CAIA,OAAQJ,GACR,IAAK,IACCG,EAKAC,EACHvE,GAAOmE,EAGPD,GAASC,GARVI,GAAe,EACfL,EAAQ,IAWTI,IACA,MACD,IAAK,MACJA,EAuBKC,EACHvE,GAAOmE,EAGPD,GAASC,GAxBVnE,EAAMA,EACJvI,QAAQ,MAAO,MACfA,QAAQ,UAAW,MACnBA,QAAQ,MAAO,KACfA,QAAQ,SAAU,KAClBmN,OAEFV,EAAQA,EAAMU,QAEuC,GAAjD5E,EAAI5J,QA1QO,cA2Qd/C,KAAKmO,WAAWhI,KAAK,CAAE4H,EAAyBpB,EAAK3M,KAAKwR,gBAAgBX,KAG1E7Q,KAAKmO,WAAWhI,KAAK,CAAE4H,EAAuBpB,EAAK3M,KAAKyR,iBAAiBZ,KAG1EK,GAAe,EACfvE,EAAM,IAUP,MACD,QACKuE,EACHvE,GAAOmE,EAGPD,GAASC,EAKE,MAATA,GAA0B,MAATA,IAChBM,EACCC,IAAeP,IAClBM,GAAoB,IAIrBA,GAAoB,EACpBC,EAAaP,GArEf,CAwED,CAEA9Q,MAAK,GAAY,CAClB,CAGA0R,SAAAA,CAAWC,GACV,IAAK3R,KAAKkO,YAGT,IAFA,IAAMY,EAAkB9O,KAAKmO,WAAWrL,OAE/BF,EAAI,EAAGA,EAAIkM,EAAiBlM,IAAM,CAC1C,IAAMmM,EAAW/O,KAAKmO,WAAWvL,GAEjC,GAAImM,EAAS,KAAOhB,EAGnB,IAFA,IAAMiB,EAAaD,EAAS,GAEnBK,EAAI,EAAGA,EAAIJ,EAAWlM,OAAQsM,IAAM,CAC5C,IAAMD,EAAWH,EAAWI,GAEvBD,EAAS,KACbA,EAAS,GAAKA,EAAS,GAAG/K,QAAQ4J,EAAS4D,iBAAiB,CAAEjM,EAAYC,EAAIiM,IACzEjM,EACI+L,EAAQ/L,GAEPiM,EACDF,EAAQE,GAGR,KAIX,CAEF,CAEF,CAMAtC,sBAAAA,CAAwBD,GACvB,IAAMwC,EAAsB,GAkB5B,OAhBI9D,EAASyC,6BACZnB,EAAclL,QAAQ,mBAAmB,CAAE2N,EAAInM,KAC9C,IAAIwK,EAAexK,EAEfxE,EAAOwD,kBACVwL,EAAeA,EAAahM,QAAQ,eAAgB,UAGrD,IAAML,EAAW3C,EAAOa,SAASsD,IAAI6K,GAEjCrM,IAAaA,EAASvE,UACzBsS,EAAoB3L,KAAKpC,EAC1B,IAIK+N,CACR,CAGAlC,qBAAAA,CAAuBN,GACtB,OAAOA,EAAclL,QAAQ,mBAAmB,CAAE2N,EAAInM,KACrD,IAAMwK,EAAexK,EAEf7B,EAAW3C,EAAOa,SAASsD,IAAI6K,GAErC,GAAIrM,EAAU,CACb,GAAIA,EAASvE,WAAawO,EAASyC,4BAClC,MAAM,OAAN1O,OAAcgC,EAAS3D,KAAI,KAG3B,MAAM,IAAIkN,MAAM,sEAADvL,OAAuEgC,EAAS5B,KAAI,wBAErG,CAEC,MAAM,OAANJ,OAAc6D,EAAE,IACjB,GAEF,CAMA6L,gBAAAA,CAAkBO,GAajB,IAZA,IAAIhD,EAAa,GACbrC,EAAM,GACNkE,EAAQ,GACRoB,EAAU,GACVnB,EAAO,GACPC,EAAW,GACXC,EAAW,GACXE,GAAe,EACfC,GAAmB,EACnBC,GAAoB,EACpBC,EAAa,GAERzO,EAAI,EAAGA,EAAIoP,EAAalP,OAAQF,IAAM,CAK9C,GAJAkO,EAAOkB,EAAapP,GACpBmO,EAAWiB,EAAapP,EAAI,GAC5BoO,EAAWgB,EAAapP,EAAI,GAEf,MAATkO,GAA6B,MAAbE,EACnBG,GAAmB,EACnBc,EAAU,QAEN,GAAiB,MAAblB,GAA6B,MAATD,EAAc,CAC1CK,GAAmB,EACnBc,GAAWnB,EACX9B,EAAW7I,KAAK,EAAE,EAAM8L,IACxB,QACD,CAEA,GAAId,EACHc,GAAWnB,MADZ,CAKA,OAAQA,GACR,IAAK,IACAM,EACCF,EACHvE,GAAOmE,EAGPD,GAASC,EAIVI,GAAe,EAEhB,MACD,IAAK,IACCE,IAEJzE,EAAMmB,EAAWnB,EAAI4E,SAAW5E,EAAI4E,OAEpCV,EAAQ7Q,KAAKkS,kBAAkBrB,GAE/B7B,EAAW7I,KAAK,EAAE,EAAOwG,EAAKkE,IAE9BK,GAAe,EACfvE,EAAM,GACNkE,EAAQ,IAET,MACD,QACKK,EACHvE,GAAOmE,EAGPD,GAASC,EAKE,MAATA,GAA0B,MAATA,IAChBM,EACCC,IAAeP,IAClBM,GAAoB,IAIrBA,GAAoB,EACpBC,EAAaP,GAhDf,CAmDD,CAYA,OAVID,IAEHlE,EAAMmB,EAAWnB,EAAI4E,SAAW5E,EAAI4E,OAGpCV,EAAQ7Q,KAAKkS,kBAAkBrB,GAE/B7B,EAAW7I,KAAK,EAAE,EAAOwG,EAAKkE,KAGxB7B,CACR,CAEAkD,iBAAAA,CAAmBrB,GAelB,OAZ8C,IAF9CA,EAAQA,EAAMU,QAEJxO,QAAQgL,KACjB8C,EAAQA,EAAMzM,QAAQ,iBAAiB,CAAC+N,EAAGC,EAAMC,EAAGC,MAGT,IAF1CF,EAAI,QAAArQ,OAAYqQ,IAELrP,QAlfT,UAkfiF,GAApCqP,EAAKrP,QAjflD,UAkfDqP,GAjfC,QAofI,OAANrQ,OAAeqQ,EAAI,SAIdvB,CACR,CAMAW,eAAAA,CAAiBe,GAahB,IAZA,IAAI5F,EAAM,GACNkE,EAAQ,GACRC,EAAO,GACPC,EAAW,GACXC,EAAW,GACXC,EAAQ,EACRC,GAAe,EACfC,GAAmB,EACnBC,GAAoB,EACpBC,EAAa,GACbxB,EAAY,GAEPjN,EAAI,EAAGA,EAAI2P,EAAczP,OAAQF,IAAM,CAK/C,GAJAkO,EAAOyB,EAAc3P,GACrBmO,EAAWwB,EAAc3P,EAAI,GAC7BoO,EAAWuB,EAAc3P,EAAI,IAExBwO,EACJ,GAAa,MAATN,GAA6B,MAAbE,EACnBG,GAAmB,OAEf,GAAiB,MAAbJ,GAA6B,MAATD,IAC5BK,GAAmB,EACfD,GACH,SAKH,IAAIC,IAAoBD,EAAxB,CAIA,OAAQJ,GACR,IAAK,IACCG,EAKAC,EACHvE,GAAOmE,EAGPD,GAASC,GARVI,GAAe,EACfL,EAAQ,IAWTI,IACA,MACD,IAAK,MACJA,EAkBKC,EACHvE,GAAOmE,EAGPD,GAASC,GAnBVnE,EAAMA,EACJvI,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfA,QAAQ,MAAO,KACfA,QAAQ,SAAU,KAClBmN,OAEFV,EAAQA,EAAMU,OAEd1B,EAAU1J,KAAK,CAAEwG,EAAK3M,KAAKyR,iBAAiBZ,KAE5CK,GAAe,EACfvE,EAAM,IAUP,MACD,QACKuE,EACHvE,GAAOmE,EAGPD,GAASC,EAKE,MAATA,GAA0B,MAATA,IAChBM,EACCC,IAAeP,IAClBM,GAAoB,IAIrBA,GAAoB,EACpBC,EAAaP,GAhEf,CAmED,CAEA,OAAOjB,CACR,CAEA2C,uBAAyB,oEAMzB,wBAAOC,CAAmBnD,GACzB,IAAIoD,EAAQ,GAQZ,OANApD,EAAclL,QAAQ,iBAAiByM,IACtC6B,EAAMvM,KAAK0K,EACTU,OACAnN,QAAQ,eAAgB,IAAG,IAGvBsO,CACR,CAEAF,mCAAqC,KACC,mBAA1BlI,OAAOqI,gBAAiClE,SAASmE,uBAAuBD,gBAC9C,mBAAzBrI,OAAOuI,eAAqF,mBAA9CvI,OAAOuI,cAAcC,UAAUC,WAFrD,GAUrC,UAAI3L,GAEH,IAAKpH,MAAK,GAAaA,MAAK,EAAU,CACrCA,KAAK4Q,OAAO5Q,MAAK,GAEjB,IAAM2R,EAAUhE,IAAIC,SAAS+D,QAAQqB,KAAKrF,IAAIC,UAE9C5N,KAAK0R,UAAUC,GACf3R,KAAK2O,SAEL3O,MAAK,EAAW,IACjB,CAEA,IAAIiT,EAGJ,GAAIjT,KAAKkT,qBACRD,EAAoBxE,SAASC,cAAc,UACzBwB,YAAclQ,KAAKkT,yBAGjC,GAAIlT,KAAKuO,gBAAiB,CAC9B0E,EAAoBxE,SAASC,cAAc,SAC3C,IAAMyE,EAAqBnT,KAAKuO,gBAAgBpK,KAAK,IACrD8O,EAAkB/C,YAAciD,EAG3BnT,KAAKsO,+BACTtO,KAAKuO,gBAAkB,KACvBvO,KAAKkT,oBAAsBC,EAE7B,CAEA,IAAMC,EAAY,CAAEpT,KAAKwO,UAAU6E,WAAU,IAM7C,OAJIJ,GACHG,EAAUjN,KAAK8M,GAGTG,CACR,CAEA,eAAI7L,GACH,OAAOJ,EAAEc,QAAQjI,KAAKsO,6BACvB,EAGD,UC1rBA,MAAMgF,UAAkBtI,EAAAA,EACvB,GAAU,GAEVS,OAAAA,CAASgC,EAAS1J,GACjB,IACC,IAAMmD,EAAW,IAAI8G,EAASP,EAAS1J,EAASlE,IAIhD,OAFAG,MAAK,EAAQmG,KAAKe,GAEXA,CACR,CACA,MAAOqC,GACN1H,QAAQC,MAAMyH,EACf,CACD,EAGD,UCjBA,MAAMgK,UAAoBvI,EAAAA,EACzB9J,IAAAA,CAAM6C,GAOL,OAAO/D,KAAKwT,MAAMzP,EACnB,CAEAyP,KAAAA,CAAOzP,EAAUyE,GAAY,GAC5B,OAAO,IAAIlH,SAAQ,CAACC,EAASkH,KAC5B,IAAMgL,EAAQ,IAAIC,MAElBD,EAAM3K,OAAS,KACd2K,EAAM3K,OAAS2K,EAAM1K,QAAU,KAE/BxH,EAAQkS,EAAK,EAGdA,EAAM1K,QAAUY,IACf8J,EAAM3K,OAAS2K,EAAM1K,QAAU,KAE3BP,EAEHxI,KAAKwT,MAAMzP,GAAU,GACnBpC,KAAKJ,GACLK,MAAM6G,GAGRA,EAAO,6BAAD1G,OAA+B4H,GAAGgK,OAAOC,KAChD,EAGDH,EAAMG,IAAM7P,EAAS3D,OAEvB,EAwCD,UC9EA,IA6GOyT,EA+EAC,EAiFAC,EA7QDC,GA6GCH,EAAsBpR,IAK3B,IAJA,IAAMwR,EAAW,CAAC,EACZC,EAASzR,EAAO2K,MAAM,KACxB+G,GAAoB,EAEfvR,EAAI,EAAGA,EAAIsR,EAAOpR,OAAQF,IAAM,CACxC,IAAMwR,EAAQF,EAAOtR,GAAGwK,MAAM,KAE9B,GAAoB,GAAhBgH,EAAMtR,OAAa,CACtB,IAAI6J,EAAMyH,EAAM,GAAG7C,OACbV,EAAQuD,EAAM,GAAG7C,OAEvB,GAAI,SAAS9M,KAAKkI,GACjBA,EAAMA,EAAIvI,QAAQ,SAAU,SAExB,GAAI,KAAKK,KAAKkI,GAClB,SAGD,GAAI,eAAelI,KAAKoM,GACvBoD,EAAStH,GAAO,CACf1L,KAAM,QACNgC,MAAO,EACP4N,MAAOkD,EAAWlD,IAEnBsD,GAAoB,MAEhB,CAGJ,IAFA,IAAME,EAAcxD,EAAMzD,MAAM,KAEvBgC,EAAI,EAAGA,EAAIiF,EAAYvR,OAAQsM,IAGvC,GAFAiF,EAAYjF,GAAKkF,WAAWD,EAAYjF,GAAGmC,WAErC,IAAY8C,EAAYjF,IAAMiF,EAAYjF,GAAKmF,KAAW,CAC/DF,EAAYvR,OAAS,EACrB,KACD,CAGGuR,EAAYvR,SACfmR,EAAStH,GAAO,CACf1L,KAAM,SACNuT,MAAO,EACPC,IAAK,EACLC,KAAM,GAEPP,GAAoB,EAEM,GAAtBE,EAAYvR,QACfmR,EAAStH,GAAK6H,MAAQ,EACtBP,EAAStH,GAAK8H,IAAMJ,EAAY,IAEF,GAAtBA,EAAYvR,QACpBmR,EAAStH,GAAK6H,MAAQH,EAAY,GAClCJ,EAAStH,GAAK8H,IAAMJ,EAAY,KAGhCJ,EAAStH,GAAK6H,MAAQH,EAAY,GAClCJ,EAAStH,GAAK8H,IAAMJ,EAAY,GAChCJ,EAAStH,GAAK+H,KAAOL,EAAY,IAGlCJ,EAAStH,GAAKgI,QAAUV,EAAStH,GAAK6H,MAExC,CACD,CACD,CAEA,OAAIL,EACIF,EAGD,MAOFH,EAAuBrR,IAI5B,IAHA,IAAMmS,EAAkB,GAClBC,EAAYpS,EAAO2K,MAAM,KAEtBxK,EAAI,EAAGA,EAAIiS,EAAU/R,OAAQF,IAAM,CAC3C,IAAMwR,EAAQS,EAAUjS,GAAGwK,MAAM,KAEjC,GAAoB,GAAhBgH,EAAMtR,OAAa,CACtB,IAAI6J,EAAMyH,EAAM,GAAG7C,OACfV,EAAQuD,EAAM,GAAG7C,OAErB,GAAI,SAAS9M,KAAKkI,GACjBA,EAAMA,EAAIvI,QAAQ,SAAU,SAExB,GAAI,KAAKK,KAAKkI,GAClB,SAGD,GAAW,SAAPA,GAAyB,MAAPA,EAAa,CAMlC,IALA,IAAMmI,EAAiB,CACtBnI,MACA5E,OAAQ,IAGF8I,EAAM/N,QAAQ,CACpB,IAAMiS,EAAoBlE,EAAM9N,QAAQ,KAExC,GAAIgS,EAAmB,CACtB,IAA0B,GAAtBA,EAAyB,CAC5BD,EAAe/M,OAAO5B,KAAK,CAC1BlF,KAAM,OACN4P,UAED,KACD,CAEC,IAAMmE,EAAkBnE,EAAM9N,QAAQ,IAAKgS,GAE3C,IAAwB,GAApBC,EAaH,OADAlP,KAAK,gEACE,GAZPgP,EAAe/M,OAAO5B,KAAK,CAC1BlF,KAAM,OACN4P,MAAOA,EAAMxN,UAAU,EAAG0R,KAE3BD,EAAe/M,OAAO5B,KAAK,CAC1BlF,KAAM,MACN4P,MAAOA,EAAMxN,UAAU0R,EAAoB,EAAGC,KAE/CnE,EAAQA,EAAMxN,UAAU2R,EAAkB,EAO7C,KACK,CACJ,IAAMA,EAAkBnE,EAAM9N,QAAQ,KAEtC,IAAwB,GAApBiS,EASH,OADAlP,KAAK,gEACE,GARPgP,EAAe/M,OAAO5B,KAAK,CAC1BlF,KAAM,MACN4P,MAAOA,EAAMxN,UAAU,EAAG2R,KAE3BnE,EAAQA,EAAMxN,UAAU2R,EAAkB,EAM5C,CACD,CAEAJ,EAAgBzO,KAAK2O,EACtB,CACD,CACD,CAEA,OAAOF,GAIFb,EAAatR,IAMlB,IALA,IAAMwS,EAAQxS,EACZ2B,QAAQ,WAAY,IACpBgJ,MAAM,KACJ8H,EAAa,IAERtS,EAAI,EAAGA,EAAIqS,EAAMnS,OAAQF,IAAM,CACvC,IAAMiO,EAAQoE,EAAMrS,GAAG2O,OAEnB,SAAS9M,KAAKoM,GACjBqE,GAAcrE,EAEN,SAASpM,KAAKoM,GACtBqE,GAAcrE,EAAMzM,QAAQ,SAAU,KAGtC8Q,GAAU,IAAAnT,OAAQ8O,EAAK,KAGpBjO,EAAIqS,EAAMnS,OAAS,IACtBoS,GAAc,IAEhB,CAEAA,GAAc,IAEd,IAAM,OAAO1J,KAAK9J,MAAMwT,EAAY,CACpC,MAAO3L,GAAazH,MAAMyH,EAAW,CAErC,MAAO,EAAC,EAxST,SAAgB4L,GACf,IAAKC,UAAUtS,OACd,MAAM,IAAIS,UAAU,4FAEhB,KAAM4R,aAA4BE,kBAAoBF,aAA4BG,SACtF,MAAM,IAAI/R,UAAU,gGAGrB,IAAK,IAAMsD,KAAW9B,MAAMwQ,KAAKJ,EAAiBK,iBAAiB,eAAgB,CAClF,IAAMC,EAAS5O,EAAQ6O,WACnBC,EAAgB,GAChBC,EAAsB,GAE1B,GAAIH,EAAQ,CAaX,GAZA5O,EAAQgP,UAAUC,OAAO,aAErBjP,EAAQkP,aAAa,cACxBJ,EAAgB9O,EAAQmP,aAAa,YACrCnP,EAAQoP,gBAAgB,aAGrBpP,EAAQkP,aAAa,oBACxBH,EAAsB/O,EAAQmP,aAAa,kBAC3CnP,EAAQoP,gBAAgB,mBAGrBN,EAAe,CAClB,IAAMO,EAAYrC,EAAoB8B,GAEtC,GAAIO,EAAW,CACd,IAAMtB,EAAkBgB,EAAsB9B,EAAqB8B,GAAuB,KACpFO,EAAY,CAAC,EACfC,GAAa,EAEjB,EAAG,CACF,IAAK,IAAMC,KAAYH,EAAW,CACjC,IAAMjC,EAAWiC,EAAUG,GAE3B,GAAqB,SAAjBpC,EAAShT,KAAiB,CAC7B,KAAIgT,EAAShR,MAAQgR,EAASpD,MAAM/N,QAG/B,CACJsT,GAAa,EACb,KACD,CALCD,EAAUE,GAAYpC,EAASpD,MAAMoD,EAAShR,QAMhD,MACK,GAAqB,UAAjBgR,EAAShT,KAAkB,CACnC,KAAIgT,EAASS,KAAO,GAAKT,EAASQ,KAAOR,EAASU,SAAW,EAAIV,EAASS,MAAQT,EAASU,SAAWV,EAASQ,KAI1G,CACJ2B,GAAa,EACb,KACD,CANCD,EAAUE,GAAYpC,EAASU,QAC/BV,EAASU,SAAWV,EAASS,IAM/B,CACD,CAEA,IAAK0B,EAAY,CAChB,IAAME,EAAQzP,EAAQwM,WAAU,GAEhC,GAAIuB,EACH,QAAArE,KAEKqE,EAAiB,CAGrB,IAHsB,IADtBjI,EAAG4D,EAAH5D,IAAK5E,EAAMwI,EAANxI,OAEDwO,EAAsB,GAEjB9G,EAAI,EAAGA,EAAI1H,EAAOjF,OAAQ2M,IAAM,CACxC,IAAMoB,EAAQ9I,EAAO0H,GAEH,QAAdoB,EAAM5P,KACTsV,GAAuB1F,EAAMA,MAEP,OAAdA,EAAM5P,OACR4P,EAAMA,SAASsF,GACpBrQ,KAAK,mDAGNyQ,GAAuBJ,EAAUtF,EAAMA,OAEzC,CAEW,SAAPlE,EACH2J,EAAMT,UAAUW,IAAID,GAEL,MAAP5J,IACR2J,EAAMzW,GAAK0W,EAEb,CAGDd,EAAOgB,aAAaH,EAAOzP,EAC5B,CACD,QAAUuP,EACX,CACD,CAEAX,EAAOiB,YAAY7P,EACpB,CACD,CACD,GAyMD,MAAM8P,UAAmB3L,EAAAA,EACxBS,OAAAA,CAASgC,EAAS1J,GACjB,IAAMoR,EAAmB1G,SAASmI,yBAC5BC,EAAapI,SAASC,cAAc,OAEtCoI,GAAc,EACdC,GAAY,EAEhB,IAGoB,IAFnBD,EAAarJ,EAAQ1K,QAAQ,cAG5BgU,EAAWtJ,EAAQ1K,QAAQ,SAAO+T,GAGjCrJ,GADgB,GAAbsJ,EACI,GAAAhV,OAAM0L,EAAQpK,UAAU,EAAGyT,IAAW/U,OAAG0L,EAAQpK,UAAU0T,EAAW,IAGnEtJ,EAAQpK,UAAU,EAAGyT,WAGV,GAAfA,GAETD,EAAWG,UAAYvJ,EAEvB,IAAMwJ,EAAMlS,MAAMwQ,KAAKsB,EAAWK,YAElC,IAAK,IAAMC,KAAaF,EACvB9B,EAAiB7N,YAAY6P,GAS9B,OANAnD,EAAMmB,GAENnV,KAAKoX,sBAAsBjC,GAE3BnV,KAAKqX,aAAatT,EAAUoR,GAErBA,CACR,CAGAiC,sBAAwBjC,IACvB,IAGIzL,EACH9G,EACAwM,EALKpL,EAAamR,EAAiBK,iBAAiB,mBAOrD,IAAK5S,EANoBoB,EAAWlB,OAMR,EAAGF,GAAK,EAAIA,IAAM,CAC7C,GAAIoB,EAAWpB,GAAGmT,aAAa,uBAAwB,CACtD,KAAO/R,EAAWpB,GAAGsU,WAAWpU,QAC/BkB,EAAWpB,GAAG8T,YAAY1S,EAAWpB,GAAGsU,WAAW,IAGpD,IAAM/U,EAAO6B,EAAWpB,GACtBoT,aAAa,uBACb5R,QAAQ,sBAAuBgE,OAAOjG,MAIxC,GAAoB,iBAFpBuH,EAAOiE,IAAIC,SAAS+D,QAAQxP,IAK3B,IAFAuH,EAAOA,EAAK0D,MAAM,MAEbgC,EAAI,EAAGA,EAAI1F,EAAK5G,OAAQsM,IAC5BpL,EAAWpB,GAAG0E,YAAYmH,SAAS6I,eAAe5N,EAAK0F,KAEnDA,EAAI1F,EAAK5G,OAAS,GACrBkB,EAAWpB,GAAG0E,YAAYqG,IAAIe,cAAc,CAAE7K,IAAK,aAKrDG,EAAWpB,GAAGsN,YAAcxG,EAG7B1F,EAAWpB,GAAGqT,gBAAgB,sBAC/B,CAEAjS,EAAWpB,GAAGiT,UAAUC,OAAO,iBAChC,GAIDuB,aAAeA,CAACtT,EAAUoR,KACzB,IACC,IAAMoC,EAAaxT,EAASzD,SAASqT,OAErC,GAAI4D,EAAY,CACf,IAAM5D,EAASlF,SAAS+I,cAAcD,GAElC5D,GACHA,EAAOrM,YAAY6N,EAAiB9B,WAAU,IAE9CtP,EAAS/B,UAIU,mBAAfuV,GACY9I,SAAS+I,cAAc,yBAE/BlQ,YAAY6N,EAAiB9B,WAAU,IAE9CtP,EAAS/B,UAGT8D,KAAK,mCAAqCyR,EAAa,KAG1D,CACD,CACA,MAAOhO,GAAazH,MAAMyH,EAAW,GAIvC,UCnaA,MAAMkO,UAAoBzM,EAAAA,EACzB,UAAM9J,CAAM6C,GACX,UACOhE,MAAMmB,KAAK6C,GAEjB2T,MAAMC,OAAO5T,EACd,CACA,MAAO4F,GACN9H,QAAQC,MAAM6H,EACf,CACD,EAGD,U,+DCDA,MAAMvI,EACL,GAAa,IAAIoC,EAEjB,GAGA,GAGA,GAAkB,IAAIoU,EAGtB,GAAY,CAAC,EAGb,GAGA,GAEA,gBAAMC,CAAYjM,EAAOhH,EAAiBkT,GACzC,GAAI1W,EAAOa,SACV,OAAOb,EAAOa,SAGfb,EAAOa,SAAWjC,KAClBoB,EAAOwD,gBAAkBA,EAEzB5E,MAAK,EAAY4L,EACjB5L,MAAK,EAAiB8X,EAEtB9X,KAAK+X,aAON,CAGA,UAAM7W,CAAMpB,EAAM2D,EAAYC,GAAgB,GAC7C,IAAIM,EASJ,KANCA,EADGlE,aAAgB0D,EACN1D,EAGAE,MAAK,EAAW4D,UAAU9D,IAGxBN,SAAU,CACzB,IAAM4L,EAAc,IAAI9J,SAAQC,IAC/ByC,EAAWoC,KAAK,SAAU7E,EAAO,IAKlC,OAFAvB,MAAK,EAAgBmG,KAAKnC,EAAYN,EAAeD,GAE9C2H,CACR,CAEA,OAAOpH,CACR,CAGAJ,SAAAA,IAAaoU,GACZ,OAAOhY,MAAK,EAAW4D,aAAaoU,EACrC,CAGA1T,UAAAA,IAAc0T,GACb,OAAOhY,MAAK,EAAWsE,cAAc0T,EACtC,CAGAzS,GAAAA,IAAOyS,GACN,OAAOhY,MAAK,EAAWuF,OAAOyS,EAC/B,CAGA5S,WAAAA,IAAe4S,GACd,OAAOhY,MAAK,EAAWoF,eAAe4S,EACvC,CAGAC,cAAAA,CAAenY,GACd,IAAIsS,EAAOtS,EAAKsS,KAMhB,OAJIhR,EAAOwD,iBAAmC,iBAATwN,GAAqB,eAAe3N,KAAK2N,KAC7EA,EAAOA,EAAKhO,QAAQ,eAAgB,UAG9BpE,KAAKoF,YAAYgN,EAAMtS,EAC/B,CAEAkC,MAAAA,CAAQlC,GACP,GAAIA,aAAgB0D,EAAqB,CACxC,IACIM,EADEI,EAAYpE,EAAKoE,UAGvB,IAAKJ,KAAcI,EAClBlE,MAAK,EAAWsF,eAAexB,EAEjC,MAEC9D,MAAK,EAAWsF,eAAexF,EAAKD,GAEtC,CAEAkY,WAAAA,GACC/X,MAAK,EAAW,IAEhB,IAAMkY,EAAUzJ,SAAS+I,cAAc,QAEnCU,IACHlY,MAAK,EAAWkY,EAAQlC,aAAa,QAwCvC,CAEA,kBAAMmC,CAAchW,EAAMiW,GAAW,GACpC,IACC,IAAMC,EAAkBrY,MAAK,EAAY,MAAQA,MAAK,EAChDH,EAAS,mBAAkBkC,OAAKsW,EAAe,KAAAtW,OAAMI,EAAI,SAEzDmW,EAAMtY,MAAK,EAAWoF,YAAYvF,EAAI,CAC3CoB,KAAM,WACNZ,QAASL,MAAK,EAAY8L,KAAKC,MAAQ,KAGxC,GAAIuM,EAAK,CACR,IAGIxU,EAFEI,SADmBoU,EAAIpX,QACAgD,UAI7B,IAAKJ,KAAcI,EAAW,CAC7B,IAAMH,EAAWG,EAAUJ,GAE3B9D,MAAK,EAAWqE,aAAaN,EAC9B,CACD,CACD,CACA,MAAO4F,GACN9H,QAAQC,MAAM6H,EACf,CAEA3J,KAAKuY,qBACLvY,KAAKwY,iCACN,CAMA,uBAAMC,GACL5W,QAAQsJ,IAAI,wBAEZ,IAAMuN,EAAOC,WAAWlD,OAAOmD,gBAAkB,IAEjD,IACC,IAAMzM,QAAoB/K,EAAOC,QAAQqM,KAAKhM,MAAM,CACnDtB,KAAK,GAAD2B,OAAM2W,EAAI,qBAGf1Y,KAAKmM,YAAcA,CACpB,CACA,MACCtK,QAAQC,MAAM,8BACf,CACD,CAEA0W,+BAAAA,GACC,IAAMK,EAAoB7Y,KAAK4D,UAAU,qBACnCkV,EAAoB,GAEtBD,EAAkB/V,SACrB+V,EAAkB7R,SAAQjD,IACpBA,EAASvD,eACbsY,EAAkB3S,KAAKpC,EAAS5B,KACjC,IAGG2W,EAAkBhW,QACrB9C,KAAKsE,WAAWwU,GACd9W,SAGL,CAMA+W,UAAAA,CAAYpM,EAAKkE,EAAO/Q,GACvB,GAAIsV,UAAUtS,OAAS,EACtB,MAAM,IAAIS,UAAU,8EAADxB,OAA+EqT,UAAUtS,OAAM,cAE9G,KAAkB,iBAAP6J,GAAqBA,aAAeqM,QACnD,MAAM,IAAIzV,UAAU,+EAEhB,GAAoB,iBAATsN,KAAuBA,aAAiBmI,QACvD,MAAM,IAAIzV,UAAU,+EAGrBqE,OAAOqR,eAAejZ,MAAK,EAAW2M,EAAK,CAC1CkE,MAAOA,EACPqI,YAAY,IAGblZ,KAAKuY,oBACN,CAEAA,kBAAAA,GACC,IAAM7S,EAAW1F,MAAK,EAEtB,GAAI0F,GAAYA,EAASG,KAAM,CAC9B,IAAMsT,EAA0B,OAAlBzT,EAASG,KAGjBuT,EAAuBA,CAACvT,EAAMwT,KACnC,IAAMnV,EAAYlE,KAAK4D,UAAUiC,GAAM3B,UAEjCoV,EAAanS,EACjBoS,MAAMvZ,KAAK4D,UAAUyV,GAAOnV,WAC5BsV,IAAI,QACJA,KAAIvU,GAAQA,EAAKb,QAAQ,SAAU,OACnCyM,QAEI4I,EAAkBtS,EAAEuS,OAAOxV,GAAWoU,IAAQnR,EAAE8D,SAASqO,EAAYhB,EAAInW,KAAKiC,QAAQ,SAAU,QAEtG,IAAK,IAAML,KAAY0V,EACtB1V,EAASxE,KAAO4H,EAAEuS,OAAO3V,EAASxE,MAAMsE,GAAOA,IAAQgC,IACvD9B,EAASxE,KAAK4G,KAAKkT,EACpB,IAhB8B,OAAlB3T,EAASG,OAmBbuT,EAAqB,KAAM1T,EAASG,OAC5CsT,GAASC,EAAqB,KAAM1T,EAASG,MAE9C7F,KACE4D,UAAU,aAAD7B,OAAc2D,EAASG,OAChC7D,QACH,CACD,CAEAmI,MAAAA,GACCnK,MAAK,EAAgB4K,eAAeT,OAAOnK,MAAK,EACjD,CAEAkK,KAAAA,GACClK,MAAK,EAAgB4K,eAAeV,MAAMlK,MAAK,EAChD,CAGA,oBAAOuL,CAAexH,GACrB,OAAO3C,EAAOqI,MAAM1F,EAAS3D,KAAM,CAClCoI,UAAW3H,QAAQkD,EAASrE,YAC5BqE,YAEF,CASA,YAAO0F,CAAOkQ,EAAU7Z,EAAO,CAAC,GAC/B,IAAM4I,EAAU,IAAIR,EAEd0R,EAAYhS,OAAOiS,OAAO,CAC/BrR,WAAW,GACT1I,GAEH,OAAO4I,EAAQP,QAAQwR,EAAUC,EAClC,CAGA,sBAAOxX,CAAiB2B,GACvB,IAEIqM,EACH0J,EAHDC,EAA0C3Y,EAAO4Y,kBAAzCC,EAAQF,EAARE,SAAUC,EAAQH,EAARG,SAAUC,EAAIJ,EAAJI,KAAMC,EAAGL,EAAHK,IAC5B/Z,EAAU0D,EAAS1D,QAAO,MAAA0B,OAAUgC,EAAS1D,SAAa,GAIhE,GAAI0D,EAAStD,KAAM,CAClB,IAAM4Z,EAAYtW,EAASrD,UAAUoC,OAC/BwX,EAAiBvW,EAASlE,GAAGwD,WAAWgX,EAAWtW,EAASlE,GAAGiD,OAASuX,GAE9EjK,EAAY,GAAArO,OAAOuY,GAAcvY,OAAKgC,EAAStD,KAAI,KAAAsB,OAAMgC,EAASrD,UACnE,MAEC0P,EAAerM,EAASlE,GAGzB,IAAM0a,EAAe,GAAAxY,OAAIqY,GAAGrY,OAAKqO,GAAYrO,OAAK1B,GAAW+D,QAAQ,KAAM,KAE3E,GAAiB,UAAb6V,GAAqC,SAAbA,GAAoC,WAAbA,EAClD,GAAIlW,EAASvD,cAAe,CAC3B,IAAMkY,EAAOC,WAAWlD,OAAOmD,gBAAkB,IAEjDkB,EAAkB,GAAA/X,OAAO2W,GAAI3W,OAAKwY,EACnC,MAECT,EAAkB,GAAA/X,OAAOkY,EAAQ,MAAAlY,OAAOmY,GAAQnY,OAAKoY,EAAO,IAAMA,EAAO,IAAEpY,OAAIwY,QAIhFT,EAAkB,GAAA/X,OAAOkY,GAAQlY,OAAKwY,GAGvC,OAAOT,CACR,CAEA,qBAAIE,CAAmBnJ,GACtB,IAAM2J,Eb/WR,SAAmBA,GAClB,IAAMC,EAAS,CACdR,SAAU,GACVC,SAAU,GACVC,KAAM,GACNO,SAAU,GACVN,IAAK,GACL1B,KAAM,GACNiC,OAAQ,IAGT,GAAIrQ,OAAO0F,UAA+C,iBAA5B1F,OAAO0F,SAASiK,UAA2D,iBAA5B3P,OAAO0F,SAASkK,UAAuD,iBAAxB5P,OAAO0F,SAASmK,MAAuD,iBAA5B7P,OAAO0F,SAAS0K,SACtLD,EAAOR,SAAW3P,OAAO0F,SAASiK,SAClCQ,EAAOP,SAAW5P,OAAO0F,SAASkK,SAClCO,EAAON,KAAO7P,OAAO0F,SAASmK,KAC9BM,EAAOC,SAAWpQ,OAAO0F,SAAS0K,cAGlC,IACC,IAAM1K,EAAW,IAAI4K,IAAInM,SAASmM,KAEF,iBAArB5K,EAASiK,UAAoD,iBAArBjK,EAASkK,UAAgD,iBAAjBlK,EAASmK,MAAgD,iBAArBnK,EAAS0K,WACvID,EAAOR,SAAWjK,EAASiK,SAC3BQ,EAAOP,SAAWlK,EAASkK,SAC3BO,EAAON,KAAOnK,EAASmK,KACvBM,EAAOC,SAAW1K,EAAS0K,SAE7B,CACA,MAAOnR,GAAa1H,QAAQiE,KAAKyD,EAAW,CAG7C,GAAKiR,EAAIzX,QAAQ,SAQZ,GAAKyX,EAAIzX,QAAQ,SAQjB,CAEJ,IAMK8X,EAiCAA,EAvCCC,EAAgBN,EAAIra,MAAM,uBAEhC,GAAI2a,EAOH,GANAL,EAAOR,SAAWa,EAAc,GAM3BD,EAAgBL,EAAIra,MAAM,uBAAyB,CACvDsa,EAAOP,SAAWW,EAAc,GAChCJ,EAAON,KAAOU,EAAc,GAAGzW,QAAQ,IAAK,IAE5C,IAAM2W,EAAgBP,EAAIra,MAAM,4BAE/Bsa,EAAOC,SADJK,EACeA,EAAc,GAGd,GAEpB,KACK,MAAKF,EAAgBL,EAAIra,MAAM,gBAanC,MAAM,IAAImN,MAAM,wBAXhBmN,EAAOP,SAAWW,EAAc,GAEhC,IAAME,EAAgBP,EAAIra,MAAM,sBAE/Bsa,EAAOC,SADJK,EACeA,EAAc,GAGd,GAKpB,MAOA,GAAKF,EAAgBL,EAAIra,MAAM,wBAA0B,CACxDsa,EAAOP,SAAWW,EAAc,GAChCJ,EAAON,KAAOU,EAAc,GAE5B,IAAME,EAAgBP,EAAIra,MAAM,6BAC5B4a,IACHN,EAAOC,SAAWK,EAAc,GAElC,MAEK,GAAKF,EAAgBL,EAAIra,MAAM,gBAAkB,CACrDsa,EAAOP,SAAWW,EAAc,GAEhC,IAAME,EAAgBP,EAAIra,MAAM,uBAC5B4a,IACHN,EAAOC,SAAWK,EAAc,GAElC,MAEUF,EAAgBL,EAAIra,MAAM,mBACnCsa,EAAOC,SAAWG,EAAc,GAIhCJ,EAAOC,SAAWF,EAAIpW,QAAQ,cAAe,MAI/C,GAAI,QAAQK,KAAKgW,EAAOC,UACvB,GAAIpQ,OAAO0F,UAA+C,iBAA5B1F,OAAO0F,SAAS0K,SAC7CD,EAAOC,SAAWpQ,OAAO0F,SAAS0K,SAASrX,UAAU,EAAGiH,OAAO0F,SAAS0K,SAASM,YAAY,KAAO,GAAKP,EAAOC,cAGhH,IACC,IAAM1K,EAAW,IAAI4K,IAAInM,SAASmM,KAC9B5K,GAAwC,iBAArBA,EAAS0K,SAC/BD,EAAOC,SAAW1K,EAAS0K,SAASrX,UAAU,EAAG2M,EAAS0K,SAASM,YAAY,KAAO,GAAKP,EAAOC,UAGlGD,EAAOR,SAAW,GAClBQ,EAAOP,SAAW,GAEpB,CACA,MAAO3Q,GACN1H,QAAQiE,KAAKyD,GACbkR,EAAOR,SAAW,GAClBQ,EAAOP,SAAW,EACnB,CAUF,GALAO,EAAOC,SAAWD,EAAOC,SACvBtW,QAAQ,UAAW,KACnBA,QAAQ,QAAS,KAGfqW,EAAOC,SAASva,MAAM,OACzBsa,EAAOL,IAAMK,EAAOC,aAEhB,CACJ,IAAMN,EAAMK,EAAOC,SAAStN,MAAM,KAC5BsL,EAAO0B,EAAIa,MAEjBR,EAAOL,IAAMA,EAAIjW,KAAK,KAAO,IAC7BsW,EAAO/B,KAAOA,CACf,CAEA,IAAMwC,EAAcV,EAAIra,MAAM,gBAC1B+a,IACHT,EAAOE,OAASO,EAAY,GAE9B,MA3HCT,EAAOR,SAAW,QAClBQ,EAAOP,SAAW,GAClBO,EAAON,KAAO,GACdM,EAAOC,SAAW,GAClBD,EAAOL,IAAM,GACbK,EAAO/B,KAAO8B,EAAInX,UAAU,QAb5BoX,EAAOR,SAAW,QAClBQ,EAAOP,SAAW,GAClBO,EAAON,KAAO,GACdM,EAAOC,SAAW,GAClBD,EAAOL,IAAM,GACbK,EAAO/B,KAAO8B,EAAInX,UAAU,GAoI7B,MAJuB,UAAnBoX,EAAOR,WACVQ,EAAOR,SAAW,IAGZQ,CACR,CaqMcU,CAAStK,GAErB7Q,MAAK,EAAqB,CACzBia,SAAUO,EAAIP,SACdC,SAAUM,EAAIN,SACdC,KAAMK,EAAIL,KACVC,IAAKpa,MAAK,EACV0Y,KAAM8B,EAAI9B,MAGXtX,EAAO4Y,kBAAoBha,MAAK,CACjC,CAEA,qBAAIga,GACH,IAAAoB,EAAgDpb,MAAK,EAA7Cia,EAAQmB,EAARnB,SAAUC,EAAQkB,EAARlB,SAAUC,EAAIiB,EAAJjB,KAAMC,EAAGgB,EAAHhB,IAAK1B,EAAI0C,EAAJ1C,KAEvC,MAAM,GAAN3W,OAAUkY,EAAQ,MAAAlY,OAAKmY,GAAQnY,OAAGoY,EAAI,IAAApY,OAAOoY,GAAS,IAAEpY,OAAGqY,GAAGrY,OAAG2W,EAClE,CAEA,YAAIhT,GACH,OAAO1F,MAAK,CACb,CAEA,iBAAIqb,GACH,OAAOrb,MAAK,EAASoE,QAAQ,kBAAmB,GACjD,CAEAoO,eAAiB,CAChB9G,SAAU,IAAIX,EACd2C,KAAM,IAAIF,EACV8N,IAAK,IAAIhI,EACTG,MAAO,IAAIF,EACXgI,KAAM,IAAI5E,EACV6E,MAAO,IAAI/D,EACXgE,GAAI,IAAIC,EAAAA,GAITlJ,gBAGAA,uBAGAA,kBAGD,S,2UC5ZA,MAAMkJ,iBAAiB1Q,wCAAAA,EACtB9J,IAAAA,CAAM6C,GACL,OAAIA,EAASxE,MAAM0L,SAAS,OACpBjL,KAAK2b,gBAAgB5X,GAGtBhE,MAAMmB,KAAK6C,EACnB,CAEA0H,OAAAA,CAASgC,SACR,IACCmO,KAAKnO,QACN,CACA,MAAOlE,GACN1H,QAAQC,MAAMyH,EACf,CACD,CAEAoS,eAAAA,CAAiB5X,GAChB,OAAO,IAAIzC,SAAQ,CAACC,EAASkH,KAC5B,IAAMoT,EAAgBpN,SAASC,cAAc,UAE7CmN,EAAc/S,OAAS,KACtB+S,EAAc/S,OAAS+S,EAAc9S,QAAU8S,EAAc7S,QAAU6S,EAAcC,SAAW,KAEhGva,EAAQsa,EAAa,EAGtBA,EAAc9S,QAAU,KACvB0F,SAASsN,KAAKrF,YAAYmF,GAC1BA,EAAc/S,OAAS+S,EAAc9S,QAAU8S,EAAc7S,QAAU6S,EAAcC,SAAW,KAE5F/X,EAASxD,eACZkI,IAGAW,YAAW,KACVpJ,KAAK2b,gBAAgB5X,GACnBpC,KAAKJ,GACLK,MAAM6G,EAAM,GACZ,IACJ,EAGDoT,EAAc7S,QAAU6S,EAAcC,SAAWD,EAAc9S,QAC/D8S,EAAc5a,KAAO,yBACrB4a,EAAcjI,IAAM7P,EAAS3D,KAC7Byb,EAAcvQ,OAAQ,EAEtBmD,SAASsN,KAAKzU,YAAYuU,EAAa,GAEzC,EAGD,yC,sICtCA,QAhBA,MACC,WAAMna,CAAOqC,GACZ,IAAMoF,QAAiBnJ,KAAKkB,KAAK6C,GAEjC,OAAO/D,KAAKyL,QAAQtC,EAAUpF,EAC/B,CAEA7C,IAAAA,CAAM6C,GACL,OAAO3C,EAAAA,EAAOmK,cAAcxH,EAC7B,CAEA0H,OAAAA,CAASgC,EAAS1J,GACjB,OAAO0J,CACR,E","debug_id":"b07c73ef-a45b-583d-b494-cce967a42628"}